Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ release: build github-release ## to build and release artifacts
package: docker-login docker-build ## to build, package and push the artifact to a container registry

.PHONY: sign
sign: docker-sign docker-verify ## to sign the artifact and perform verification
sign: docker-login docker-sign docker-verify ## to sign the artifact and perform verification

.PHONY: lint
lint: go-lint docker-lint ## to lint
Expand Down
13 changes: 13 additions & 0 deletions config/config.sample.toml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,19 @@ turn.credentials_expiration_minutes = 1440
# network address will be open.
# udp_sockets_count =

# nack_buffer_size specifies the number of packets to buffer for NACK retransmission
# per SSRC (video stream). A larger buffer allows clients to request older packets
# but increases memory usage. Default is 256 packets (~8.5 seconds at 30fps).
# Must be a power of 2. Valid values: 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192
# nack_buffer_size = 256

# nack_disable_copy controls whether the NACK responder should store packet copies
# or just pointers. Setting this to true (disabling copy) improves performance but
# can cause crashes due to memory corruption when the ring buffer wraps around.
# Default is true for backward compatibility, but should be set to false for
# production stability to avoid memory corruption crashes.
# nack_disable_copy = true

[store]
# A path to a directory the service will use to store persistent data such as registered client IDs and hashed credentials.
data_source = "/tmp/rtcd_db"
Expand Down
2 changes: 2 additions & 0 deletions docs/env_config.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ RTCD_RTC_TURNCONFIG_STATICAUTHSECRET String
RTCD_RTC_TURNCONFIG_CREDENTIALSEXPIRATIONMINUTES Integer
RTCD_RTC_ENABLEIPV6 True or False
RTCD_RTC_UDPSOCKETSCOUNT Integer
RTCD_RTC_NACKBUFFERSIZE Integer (power of 2: 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192)
RTCD_RTC_NACKDISABLECOPY True or False
RTCD_STORE_DATASOURCE String
RTCD_LOGGER_ENABLECONSOLE True or False
RTCD_LOGGER_CONSOLEJSON True or False
Expand Down
14 changes: 7 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,26 @@ require (
github.com/gorilla/websocket v1.5.3
github.com/grafana/pyroscope-go/godeltaprof v0.1.8
github.com/kelseyhightower/envconfig v1.4.0
github.com/mattermost/logr/v2 v2.0.21
github.com/mattermost/mattermost/server/public v0.1.10
github.com/pborman/uuid v1.2.1
github.com/pion/ice/v4 v4.0.10
github.com/pion/interceptor v0.1.40
github.com/pion/logging v0.2.4
github.com/pion/rtcp v1.2.15
github.com/pion/rtp v1.8.21
github.com/pion/rtcp v1.2.16
github.com/pion/rtp v1.8.26
github.com/pion/stun/v3 v3.0.0
github.com/pion/webrtc/v4 v4.1.3
github.com/prometheus/client_golang v1.16.0
github.com/prometheus/procfs v0.11.0
github.com/stretchr/testify v1.10.0
github.com/stretchr/testify v1.11.1
github.com/vmihailenco/msgpack/v5 v5.4.1
golang.org/x/crypto v0.39.0
golang.org/x/sys v0.33.0
golang.org/x/time v0.3.0
golang.org/x/time v0.10.0
)

replace github.com/pion/interceptor v0.1.40 => github.com/streamer45/interceptor v0.0.0-20250701195358-9e4ca8111c7a
replace github.com/pion/interceptor v0.1.40 => github.com/bgardner8008/interceptor v0.0.0-20251218215555-af6c9bfab967

require (
github.com/abcum/lcp v0.0.0-20201209214815-7a3f3840be81 // indirect
Expand All @@ -49,7 +50,6 @@ require (
github.com/klauspost/compress v1.17.11 // indirect
github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404 // indirect
github.com/mattermost/ldap v3.0.4+incompatible // indirect
github.com/mattermost/logr/v2 v2.0.21 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
Expand All @@ -63,7 +63,7 @@ require (
github.com/pion/sctp v1.8.39 // indirect
github.com/pion/sdp/v3 v3.0.14 // indirect
github.com/pion/srtp/v3 v3.0.6 // indirect
github.com/pion/transport/v3 v3.0.7 // indirect
github.com/pion/transport/v3 v3.1.1 // indirect
github.com/pion/turn/v4 v4.0.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/plar/go-adaptive-radix-tree v1.0.4 // indirect
Expand Down
24 changes: 12 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgardner8008/interceptor v0.0.0-20251218215555-af6c9bfab967 h1:nARMm5bWtaaovmoBwZDWChLyEPOSXD9HeaXmlREM9PA=
github.com/bgardner8008/interceptor v0.0.0-20251218215555-af6c9bfab967/go.mod h1:pSPR73X1vaG0G9Bw40HIeE6d4c+fos8MSpMnpz1fH7g=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
Expand Down Expand Up @@ -357,10 +359,10 @@ github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=
github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA=
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo=
github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0=
github.com/pion/rtp v1.8.21 h1:3yrOwmZFyUpcIosNcWRpQaU+UXIJ6yxLuJ8Bx0mw37Y=
github.com/pion/rtp v1.8.21/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
github.com/pion/rtcp v1.2.16 h1:fk1B1dNW4hsI78XUCljZJlC4kZOPk67mNRuQ0fcEkSo=
github.com/pion/rtcp v1.2.16/go.mod h1:/as7VKfYbs5NIb4h6muQ35kQF/J0ZVNz2Z3xKoCBYOo=
github.com/pion/rtp v1.8.26 h1:VB+ESQFQhBXFytD+Gk8cxB6dXeVf2WQzg4aORvAvAAc=
github.com/pion/rtp v1.8.26/go.mod h1:rF5nS1GqbR7H/TCpKwylzeq6yDM+MM6k+On5EgeThEM=
github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
github.com/pion/sdp/v3 v3.0.14 h1:1h7gBr9FhOWH5GjWWY5lcw/U85MtdcibTyt/o6RxRUI=
Expand All @@ -369,8 +371,8 @@ github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw=
github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU=
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
github.com/pion/transport/v3 v3.1.1 h1:Tr684+fnnKlhPceU+ICdrw6KKkTms+5qHMgw6bIkYOM=
github.com/pion/transport/v3 v3.1.1/go.mod h1:+c2eewC5WJQHiAA46fkMMzoYZSuGzA/7E2FPrOYHctQ=
github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
github.com/pion/webrtc/v4 v4.1.3 h1:YZ67Boj9X/hk190jJZ8+HFGQ6DqSZ/fYP3sLAZv7c3c=
Expand Down Expand Up @@ -464,8 +466,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
github.com/streamer45/interceptor v0.0.0-20250701195358-9e4ca8111c7a h1:0UYiiY37zerYTtgDH5e1mkiNN2C5A2Yzq/wq7hOx6wg=
github.com/streamer45/interceptor v0.0.0-20250701195358-9e4ca8111c7a/go.mod h1:0TChgrdwvHL3iwybehNI1G9grC5zAN1j3K6c7APxW+0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
Expand All @@ -478,8 +478,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
github.com/tidwall/btree v0.4.2/go.mod h1:huei1BkDWJ3/sLXmO+bsCNELL+Bp2Kks9OLyQFkzvA8=
Expand Down Expand Up @@ -735,8 +735,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Expand Down
2 changes: 2 additions & 0 deletions service/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ func (c *Config) SetDefaults() {
c.RTC.ICEPortTCP = 8443
c.RTC.TURNConfig.CredentialsExpirationMinutes = 1440
c.RTC.UDPSocketsCount = rtc.GetDefaultUDPListeningSocketsCount()
c.RTC.NACKBufferSize = 256
c.RTC.NACKDisableCopy = true
c.Store.DataSource = "/tmp/rtcd_db"
c.Logger.EnableConsole = true
c.Logger.ConsoleJSON = false
Expand Down
25 changes: 25 additions & 0 deletions service/rtc/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ type ServerConfig struct {
// a constant multiplier of 100. E.g. On a 4 CPUs node, 400 sockets per local
// network address will be open.
UDPSocketsCount int `toml:"udp_sockets_count"`
// NACKBufferSize specifies the number of packets to buffer for NACK retransmission
// per SSRC. A larger buffer allows clients to request older packets but increases
// memory usage. Must be a power of 2. Default is 256 packets (~8.5 seconds at 30fps).
NACKBufferSize uint16 `toml:"nack_buffer_size"`
// NACKDisableCopy controls whether the NACK responder should store packet copies
// or just pointers. Disabling copy improves performance but can cause crashes due
// to memory corruption when the ring buffer wraps around. Default is true (disabled)
// for backward compatibility, but should be set to false for production stability.
NACKDisableCopy bool `toml:"nack_disable_copy"`
}

func (c ServerConfig) IsValid() error {
Expand Down Expand Up @@ -73,6 +82,22 @@ func (c ServerConfig) IsValid() error {
return fmt.Errorf("invalid UDPSocketsCount value: should be greater than 0")
}

if c.NACKBufferSize != 0 {
if c.NACKBufferSize < 32 {
return fmt.Errorf("invalid NACKBufferSize value: should be at least 32")
}

if c.NACKBufferSize > 8192 {
return fmt.Errorf("invalid NACKBufferSize value: should not exceed 8192")
}

// Buffer size must be a power of 2 (required by pion/interceptor ring buffer)
isPowerOfTwo := c.NACKBufferSize&(c.NACKBufferSize-1) == 0
if !isPowerOfTwo {
return fmt.Errorf("invalid NACKBufferSize value: must be a power of 2 (32, 64, 128, 256, 512, 1024, 2048, 4096, 8192)")
}
}

return nil
}

Expand Down
43 changes: 43 additions & 0 deletions service/rtc/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,56 @@ func TestServerConfigIsValid(t *testing.T) {
require.EqualError(t, err, "invalid UDPSocketsCount value: should be greater than 0")
})

t.Run("invalid NACKBufferSize too small", func(t *testing.T) {
var cfg ServerConfig
cfg.ICEPortUDP = 8443
cfg.ICEPortTCP = 8443
cfg.UDPSocketsCount = 1
cfg.NACKBufferSize = 16
err := cfg.IsValid()
require.EqualError(t, err, "invalid NACKBufferSize value: should be at least 32")
})

t.Run("invalid NACKBufferSize too large", func(t *testing.T) {
var cfg ServerConfig
cfg.ICEPortUDP = 8443
cfg.ICEPortTCP = 8443
cfg.UDPSocketsCount = 1
cfg.NACKBufferSize = 16384
err := cfg.IsValid()
require.EqualError(t, err, "invalid NACKBufferSize value: should not exceed 8192")
})

t.Run("invalid NACKBufferSize not power of 2", func(t *testing.T) {
var cfg ServerConfig
cfg.ICEPortUDP = 8443
cfg.ICEPortTCP = 8443
cfg.UDPSocketsCount = 1
cfg.NACKBufferSize = 100
err := cfg.IsValid()
require.EqualError(t, err, "invalid NACKBufferSize value: must be a power of 2 (32, 64, 128, 256, 512, 1024, 2048, 4096, 8192)")
})

t.Run("valid with NACKBufferSize zero (uses default)", func(t *testing.T) {
var cfg ServerConfig
cfg.ICEAddressUDP = "127.0.0.1"
cfg.ICEPortUDP = 8443
cfg.ICEPortTCP = 8443
cfg.TURNConfig.CredentialsExpirationMinutes = 1440
cfg.UDPSocketsCount = 1
cfg.NACKBufferSize = 0 // Zero is allowed, default applied when creating interceptor
err := cfg.IsValid()
require.NoError(t, err)
})

t.Run("valid", func(t *testing.T) {
var cfg ServerConfig
cfg.ICEAddressUDP = "127.0.0.1"
cfg.ICEPortUDP = 8443
cfg.ICEPortTCP = 8443
cfg.TURNConfig.CredentialsExpirationMinutes = 1440
cfg.UDPSocketsCount = 1
cfg.NACKBufferSize = 256
err := cfg.IsValid()
require.NoError(t, err)
})
Expand Down
8 changes: 4 additions & 4 deletions service/rtc/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ func (s *session) getSourceRate(mimeType, rid string) int {
rm := s.screenRateMonitors[getTrackIndex(mimeType, rid)]

if rm == nil {
s.log.Warn("rate monitor should not be nil", mlog.String("sessionID", s.cfg.SessionID))
s.log.Warn("rate monitor should not be nil")
return -1
}

Expand Down Expand Up @@ -372,7 +372,7 @@ func (s *session) sendOffer(sdpOutCh chan<- Message) error {
}

if err := s.sendMediaMapping(); err != nil {
s.log.Error("failed to send media mapping", mlog.Err(err), mlog.String("sessionID", s.cfg.SessionID))
s.log.Error("failed to send media mapping", mlog.Err(err))
}

select {
Expand Down Expand Up @@ -636,13 +636,13 @@ func (s *session) sendMediaMapping() error {
}
track := trx.Sender().Track()
if track == nil {
s.log.Warn("track is nil", mlog.String("sessionID", s.cfg.SessionID))
s.log.Warn("track is nil")
continue
}
trackID := track.ID()
trackType := getTrackType(trackID)
if trackType == "" {
s.log.Warn("track type is empty", mlog.String("sessionID", s.cfg.SessionID), mlog.String("trackID", trackID))
s.log.Warn("track type is empty", mlog.String("trackID", trackID))
continue
}
mediaMap[trx.Mid()] = dc.TrackInfo{
Expand Down
16 changes: 13 additions & 3 deletions service/rtc/sfu.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,25 @@ func initMediaEngine() (*webrtc.MediaEngine, error) {
return &m, nil
}

func initInterceptors(m *webrtc.MediaEngine) (*interceptor.Registry, <-chan cc.BandwidthEstimator, error) {
func initInterceptors(m *webrtc.MediaEngine, cfg ServerConfig) (*interceptor.Registry, <-chan cc.BandwidthEstimator, error) {
var i interceptor.Registry
generator, err := nack.NewGeneratorInterceptor()
if err != nil {
return nil, nil, err
}

// NACK
responder, err := nack.NewResponderInterceptor(nack.ResponderSize(nackResponderBufferSize), nack.DisableCopy())
bufferSize := cfg.NACKBufferSize
if bufferSize == 0 {
bufferSize = 256
}
responderOpts := []nack.ResponderOption{
nack.ResponderSize(bufferSize),
}
if cfg.NACKDisableCopy {
responderOpts = append(responderOpts, nack.DisableCopy())
}
responder, err := nack.NewResponderInterceptor(responderOpts...)
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -252,7 +262,7 @@ func (s *Server) InitSession(cfg SessionConfig, closeCb func() error) error {
return fmt.Errorf("failed to init media engine: %w", err)
}

iRegistry, bwEstimatorCh, err := initInterceptors(mEngine)
iRegistry, bwEstimatorCh, err := initInterceptors(mEngine, s.cfg)
if err != nil {
return fmt.Errorf("failed to init interceptors: %w", err)
}
Expand Down
Loading