51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package webrtc
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
// SourceHandle is the minimal interface the Registry stores per stream_id.
|
|
// The concrete type is *Source, defined in source.go.
|
|
type SourceHandle interface {
|
|
ID() string
|
|
}
|
|
|
|
// Registry is a thread-safe map from stream_id to active SourceHandle.
|
|
type Registry struct {
|
|
mu sync.RWMutex
|
|
streams map[string]SourceHandle
|
|
}
|
|
|
|
// NewRegistry returns an empty Registry.
|
|
func NewRegistry() *Registry {
|
|
return &Registry{streams: make(map[string]SourceHandle)}
|
|
}
|
|
|
|
// Register associates src with streamID. Returns an error if streamID is
|
|
// already registered.
|
|
func (r *Registry) Register(streamID string, src SourceHandle) error {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
if _, exists := r.streams[streamID]; exists {
|
|
return fmt.Errorf("webrtc: stream %q already registered", streamID)
|
|
}
|
|
r.streams[streamID] = src
|
|
return nil
|
|
}
|
|
|
|
// Lookup returns the handle for streamID. The second return value is false
|
|
// if no source is registered.
|
|
func (r *Registry) Lookup(streamID string) (SourceHandle, bool) {
|
|
r.mu.RLock()
|
|
defer r.mu.RUnlock()
|
|
src, ok := r.streams[streamID]
|
|
return src, ok
|
|
}
|
|
|
|
// Deregister removes streamID. No-op if not present.
|
|
func (r *Registry) Deregister(streamID string) {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
delete(r.streams, streamID)
|
|
}
|