~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
57 lines · 1.9 KB Raw History
package bidder

import (
	"fmt"
	"path/filepath"

	"github.com/johnandersen777/socialweb-computer-kcp/internal/component"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/guestnet"
	core "github.com/johnandersen777/socialweb-computer-kcp/internal/market/bidder"
)

const webrtcPortsDir = "webrtc-udp-ports"

type webrtcPorts struct {
	reg *component.PortRegistry
}

var _ core.GuestUDPPorts = webrtcPorts{}

// ponytail: one webrtc UDP port registry per bidder state dir; two bidders on one host share the range only through the bind probe; upgrade to a host-wide registry when one host runs several bidders with webrtc guests
func (s *Service) webrtcPorts() (core.GuestUDPPorts, error) {
	ports := s.spec.GuestNetwork.WebRTCUDPPortRange()
	if ports.Min < guestnet.HighUDPMinPort || ports.Max > 65535 || ports.Max < ports.Min {
		return nil, fmt.Errorf("bidder: spec.guestNetwork.webrtcUDPPorts %d-%d is not a range from %d to 65535", ports.Min, ports.Max, guestnet.HighUDPMinPort)
	}
	reg, err := component.OpenPortRegistry(component.PortRegistryOptions{StateDir: filepath.Join(s.stateDir(), webrtcPortsDir),
		First: int(ports.Min), Last: int(ports.Max), Host: "0.0.0.0", Network: "udp"})
	if err != nil {
		return nil, fmt.Errorf("bidder: the webrtc UDP port registry: %w", err)
	}
	return webrtcPorts{reg: reg}, nil
}

func (w webrtcPorts) Allocate(name string) (int, error) {
	lease, err := w.reg.Allocate(name)
	return lease.Port, err
}

func (w webrtcPorts) Release(name string) error { return w.reg.Release(name) }

func (w webrtcPorts) Held() []string {
	leases := w.reg.Leases()
	out := make([]string, 0, len(leases))
	for _, l := range leases {
		out = append(out, l.Name)
	}
	return out
}

func (s *Service) lanAddresses() []string {
	out, err := guestnet.HostLANAddresses()
	if err != nil {
		s.log.Warn("the bidder cannot list the host's LAN addresses; the guest's webrtc gets no forwarded LAN UDP port", "err", err)
		return nil
	}
	return out
}