From 2a3a7bb9c3c20886aa95a2e0447f9c403e12bdce Mon Sep 17 00:00:00 2001 From: zarazaex69 Date: Mon, 20 Apr 2026 20:39:34 +0300 Subject: [PATCH] feat: add VideoTrack capability to provider and carrier interfaces --- internal/carrier/bytestream.go | 26 +++++++++++++++++++++++++- internal/carrier/carrier.go | 8 ++++++++ internal/provider/provider.go | 4 +++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/internal/carrier/bytestream.go b/internal/carrier/bytestream.go index 15cc096..02a584d 100644 --- a/internal/carrier/bytestream.go +++ b/internal/carrier/bytestream.go @@ -19,13 +19,20 @@ type ByteStream interface { CanSend() bool } +// VideoTrack is a carrier capability for publishing a local video track. +type VideoTrack interface { + AddTrack(track *webrtc.TrackLocalStaticRTP) (*webrtc.RTPSender, error) +} + type legacySession struct { provider provider.Provider } // Capabilities reports the transport primitives supported by the legacy carrier. func (s *legacySession) Capabilities() Capabilities { - return Capabilities{ByteStream: true} + caps := Capabilities{ByteStream: true} + _, caps.VideoTrack = s.provider.(provider.VideoTrackCapable) + return caps } // OpenByteStream adapts the legacy provider to a generic byte stream capability. @@ -33,6 +40,15 @@ func (s *legacySession) OpenByteStream() (ByteStream, error) { return &legacyByteStream{provider: s.provider}, nil } +// OpenVideoTrack adapts a legacy provider to the generic video track capability. +func (s *legacySession) OpenVideoTrack() (VideoTrack, error) { + publisher, ok := s.provider.(provider.VideoTrackCapable) + if !ok { + return nil, ErrVideoTrackUnsupported + } + return &legacyVideoTrack{provider: publisher}, nil +} + type legacyByteStream struct { provider provider.Provider } @@ -55,3 +71,11 @@ func (p *legacyByteStream) WatchConnection(ctx context.Context) { p.provider.WatchConnection(ctx) } func (p *legacyByteStream) CanSend() bool { return p.provider.CanSend() } + +type legacyVideoTrack struct { + provider provider.VideoTrackCapable +} + +func (v *legacyVideoTrack) AddTrack(track *webrtc.TrackLocalStaticRTP) (*webrtc.RTPSender, error) { + return v.provider.AddVideoTrack(track) +} diff --git a/internal/carrier/carrier.go b/internal/carrier/carrier.go index 8c6c30e..cbc8e38 100644 --- a/internal/carrier/carrier.go +++ b/internal/carrier/carrier.go @@ -13,11 +13,14 @@ var ( ErrCarrierNotFound = errors.New("carrier not found") // ErrByteStreamUnsupported is returned when a carrier cannot provide a byte stream. ErrByteStreamUnsupported = errors.New("carrier does not support byte stream") + // ErrVideoTrackUnsupported is returned when a carrier cannot publish video tracks. + ErrVideoTrackUnsupported = errors.New("carrier does not support video tracks") ) // Capabilities describes the transport primitives a carrier can expose. type Capabilities struct { ByteStream bool + VideoTrack bool } // Session is the carrier-level runtime handle. @@ -30,6 +33,11 @@ type ByteStreamCapable interface { OpenByteStream() (ByteStream, error) } +// VideoTrackCapable is implemented by carriers that can publish video tracks. +type VideoTrackCapable interface { + OpenVideoTrack() (VideoTrack, error) +} + // Config holds carrier configuration. type Config struct { RoomURL string diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 09265ed..bbc7497 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -35,8 +35,10 @@ type Provider interface { CanSend() bool GetSendQueue() chan []byte GetBufferedAmount() uint64 +} - // AddVideoTrack adds a video track to the connection. +// VideoTrackCapable is implemented by providers that can publish video tracks. +type VideoTrackCapable interface { AddVideoTrack(track *webrtc.TrackLocalStaticRTP) (*webrtc.RTPSender, error) }