mirror of
https://github.com/pion/webrtc.git
synced 2025-10-04 23:02:48 +08:00

Interceptors are being accidentally misused by users. The issue is that an Interceptor can be re-used between multiple PeerConnections. Interceptors were designed to only be single PeerConnection aware, so state is being corrupted. Instead we are now going to provide InterceptorFactories. The default API of pion/webrtc will now be safe to use between PeerConnections. Resolves webrtc#1956
77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
// +build !js
|
|
|
|
package webrtc
|
|
|
|
import (
|
|
"github.com/pion/interceptor"
|
|
"github.com/pion/logging"
|
|
)
|
|
|
|
// API allows configuration of a PeerConnection
|
|
// with APIs that are available in the standard. This
|
|
// lets you set custom behavior via the SettingEngine, configure
|
|
// codecs via the MediaEngine and define custom media behaviors via
|
|
// Interceptors.
|
|
type API struct {
|
|
settingEngine *SettingEngine
|
|
mediaEngine *MediaEngine
|
|
interceptorRegistry *interceptor.Registry
|
|
|
|
interceptor interceptor.Interceptor // Generated per PeerConnection
|
|
}
|
|
|
|
// NewAPI Creates a new API object for keeping semi-global settings to WebRTC objects
|
|
func NewAPI(options ...func(*API)) *API {
|
|
a := &API{interceptor: &interceptor.NoOp{}}
|
|
|
|
for _, o := range options {
|
|
o(a)
|
|
}
|
|
|
|
if a.settingEngine == nil {
|
|
a.settingEngine = &SettingEngine{}
|
|
}
|
|
|
|
if a.settingEngine.LoggerFactory == nil {
|
|
a.settingEngine.LoggerFactory = logging.NewDefaultLoggerFactory()
|
|
}
|
|
|
|
if a.mediaEngine == nil {
|
|
a.mediaEngine = &MediaEngine{}
|
|
}
|
|
|
|
if a.interceptorRegistry == nil {
|
|
a.interceptorRegistry = &interceptor.Registry{}
|
|
}
|
|
|
|
return a
|
|
}
|
|
|
|
// WithMediaEngine allows providing a MediaEngine to the API.
|
|
// Settings can be changed after passing the engine to an API.
|
|
func WithMediaEngine(m *MediaEngine) func(a *API) {
|
|
return func(a *API) {
|
|
if m != nil {
|
|
a.mediaEngine = m
|
|
} else {
|
|
a.mediaEngine = &MediaEngine{}
|
|
}
|
|
}
|
|
}
|
|
|
|
// WithSettingEngine allows providing a SettingEngine to the API.
|
|
// Settings should not be changed after passing the engine to an API.
|
|
func WithSettingEngine(s SettingEngine) func(a *API) {
|
|
return func(a *API) {
|
|
a.settingEngine = &s
|
|
}
|
|
}
|
|
|
|
// WithInterceptorRegistry allows providing Interceptors to the API.
|
|
// Settings should not be changed after passing the registry to an API.
|
|
func WithInterceptorRegistry(interceptorRegistry *interceptor.Registry) func(a *API) {
|
|
return func(a *API) {
|
|
a.interceptorRegistry = interceptorRegistry
|
|
}
|
|
}
|