refactor: introduce typed per-transport options

transport.Config used to carry a flat union of video+vp8+sei tuning fields
that every transport ignored except its own. Replace with an opaque
transport.Options marker interface and per-transport Options structs
(videochannel.Options, vp8channel.Options, seichannel.Options). Datachannel
keeps an unset Options.

link.Config gains TransportOptions and drops the 16 transport-specific
fields. server.Config and client.Config follow suit. session.Config is
left untouched in this commit — buildTransportOptions packs its existing
flat fields into the typed Options bundle before calling server/client
(session.Config is rebuilt in a later commit when YAML config moves to
typed sections).

Tests that synthesized link/server/client/transport configs are updated
to pass typed Options bundles. The shared e2eTransportOptions helper
replaces three copies of the flat field bundle in e2e/tunnel_test.go.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
zarazaex69
2026-05-16 07:01:07 +03:00
parent 76026c5452
commit 74fb1d81b7
21 changed files with 553 additions and 509 deletions
+43 -35
View File
@@ -19,6 +19,8 @@ import (
"github.com/openlibrecommunity/olcrtc/internal/logger"
"github.com/openlibrecommunity/olcrtc/internal/protect"
"github.com/openlibrecommunity/olcrtc/internal/transport/vp8channel"
_ "golang.org/x/mobile/bind" // ensure gomobile bind is available
_ "google.golang.org/genproto/protobuf/field_mask" // keep gomobile on post-split genproto modules
)
@@ -241,17 +243,19 @@ func Check(
doneCh <- runClientWithReady(
ctx,
client.Config{
Link: defaultLink,
Transport: transportName,
Carrier: carrierName,
RoomURL: buildRoomURL(carrierName, roomID),
KeyHex: keyHex,
DeviceID: clientID,
LocalAddr: fmt.Sprintf("127.0.0.1:%d", socksPort),
DNSServer: defaultDNSServer,
VP8FPS: clampAtLeastOne(vp8FPS, 120),
VP8BatchSize: clampAtLeastOne(vp8BatchSize, 64),
Liveness: livenessConfig(cfg),
Link: defaultLink,
Transport: transportName,
Carrier: carrierName,
RoomURL: buildRoomURL(carrierName, roomID),
KeyHex: keyHex,
DeviceID: clientID,
LocalAddr: fmt.Sprintf("127.0.0.1:%d", socksPort),
DNSServer: defaultDNSServer,
TransportOptions: vp8channel.Options{
FPS: clampAtLeastOne(vp8FPS, 120),
BatchSize: clampAtLeastOne(vp8BatchSize, 64),
},
Liveness: livenessConfig(cfg),
},
func() {
readyOnce.Do(func() {
@@ -330,17 +334,19 @@ func Ping(
doneCh <- runClientWithReady(
ctx,
client.Config{
Link: defaultLink,
Transport: transportName,
Carrier: carrierName,
RoomURL: buildRoomURL(carrierName, roomID),
KeyHex: keyHex,
DeviceID: clientID,
LocalAddr: fmt.Sprintf("127.0.0.1:%d", socksPort),
DNSServer: defaultDNSServer,
VP8FPS: clampAtLeastOne(vp8FPS, 120),
VP8BatchSize: clampAtLeastOne(vp8BatchSize, 64),
Liveness: livenessConfig(cfg),
Link: defaultLink,
Transport: transportName,
Carrier: carrierName,
RoomURL: buildRoomURL(carrierName, roomID),
KeyHex: keyHex,
DeviceID: clientID,
LocalAddr: fmt.Sprintf("127.0.0.1:%d", socksPort),
DNSServer: defaultDNSServer,
TransportOptions: vp8channel.Options{
FPS: clampAtLeastOne(vp8FPS, 120),
BatchSize: clampAtLeastOne(vp8BatchSize, 64),
},
Liveness: livenessConfig(cfg),
},
func() {
readyOnce.Do(func() {
@@ -576,19 +582,21 @@ func startWithConfig(
err := runClientWithReady(
ctx,
client.Config{
Link: cfg.link,
Transport: cfg.transport,
Carrier: carrierName,
RoomURL: roomURL,
KeyHex: keyHex,
DeviceID: clientID,
LocalAddr: fmt.Sprintf("127.0.0.1:%d", socksPort),
DNSServer: cfg.dnsServer,
SOCKSUser: socksUser,
SOCKSPass: socksPass,
VP8FPS: cfg.vp8FPS,
VP8BatchSize: cfg.vp8BatchSize,
Liveness: livenessConfig(cfg),
Link: cfg.link,
Transport: cfg.transport,
Carrier: carrierName,
RoomURL: roomURL,
KeyHex: keyHex,
DeviceID: clientID,
LocalAddr: fmt.Sprintf("127.0.0.1:%d", socksPort),
DNSServer: cfg.dnsServer,
SOCKSUser: socksUser,
SOCKSPass: socksPass,
TransportOptions: vp8channel.Options{
FPS: cfg.vp8FPS,
BatchSize: cfg.vp8BatchSize,
},
Liveness: livenessConfig(cfg),
},
func() {
readyOnce.Do(func() {
+7 -4
View File
@@ -13,6 +13,7 @@ import (
"github.com/openlibrecommunity/olcrtc/internal/control"
"github.com/openlibrecommunity/olcrtc/internal/logger"
"github.com/openlibrecommunity/olcrtc/internal/protect"
"github.com/openlibrecommunity/olcrtc/internal/transport/vp8channel"
)
type testProtector struct {
@@ -176,9 +177,10 @@ func TestStartWithInjectedRunnerLifecycle(t *testing.T) {
SetLivenessOptions(2500, 750, 4)
runClientWithReady = func(ctx context.Context, cfg client.Config, onReady func()) error {
opts, _ := cfg.TransportOptions.(vp8channel.Options)
if cfg.Link != defaultLink || cfg.Transport != dataTransport || cfg.Carrier != carrierJazz ||
cfg.RoomURL != "any" || cfg.DeviceID != "client" || cfg.LocalAddr != "127.0.0.1:1080" ||
cfg.DNSServer != defaultDNSServer || cfg.VP8FPS != 60 || cfg.VP8BatchSize != 8 ||
cfg.DNSServer != defaultDNSServer || opts.FPS != 60 || opts.BatchSize != 8 ||
cfg.Liveness.Interval != 2500*time.Millisecond ||
cfg.Liveness.Timeout != 750*time.Millisecond ||
cfg.Liveness.Failures != 4 {
@@ -186,7 +188,7 @@ func TestStartWithInjectedRunnerLifecycle(t *testing.T) {
"RunWithReady args mismatch: link=%q transport=%q carrier=%q room=%q client=%q "+
"local=%q dns=%q vp8=%d/%d liveness=%+v",
cfg.Link, cfg.Transport, cfg.Carrier, cfg.RoomURL, cfg.DeviceID,
cfg.LocalAddr, cfg.DNSServer, cfg.VP8FPS, cfg.VP8BatchSize, cfg.Liveness,
cfg.LocalAddr, cfg.DNSServer, opts.FPS, opts.BatchSize, cfg.Liveness,
)
}
onReady()
@@ -240,12 +242,13 @@ func TestStartUsesDefaultsAndCheckWithInjectedRunner(t *testing.T) {
SetLivenessOptions(3000, 1000, 5)
runClientWithReady = func(ctx context.Context, cfg client.Config, onReady func()) error {
if cfg.Transport != dataTransport || cfg.VP8FPS != 1 || cfg.VP8BatchSize != 64 ||
opts, _ := cfg.TransportOptions.(vp8channel.Options)
if cfg.Transport != dataTransport || opts.FPS != 1 || opts.BatchSize != 64 ||
cfg.Liveness.Interval != 3000*time.Millisecond ||
cfg.Liveness.Timeout != time.Second ||
cfg.Liveness.Failures != 5 {
t.Fatalf("Check args mismatch: transport=%q vp8=%d/%d liveness=%+v",
cfg.Transport, cfg.VP8FPS, cfg.VP8BatchSize, cfg.Liveness)
cfg.Transport, opts.FPS, opts.BatchSize, cfg.Liveness)
}
onReady()
<-ctx.Done()