Add mux support. (#58)

* add mux support.

* usemux to mux.

* lint fix.

* dev script mux.

* add mux to readme.
This commit is contained in:
Miroslav Šedivý
2022-07-31 13:52:41 +02:00
committed by GitHub
parent 3d787ab67f
commit e8b875229b
10 changed files with 130 additions and 40 deletions
+8
View File
@@ -14,6 +14,7 @@ import (
)
type Room struct {
Mux bool
EprMin uint16
EprMax uint16
@@ -40,6 +41,11 @@ type Room struct {
}
func (Room) Init(cmd *cobra.Command) error {
cmd.PersistentFlags().StringSlice("usemux", []string{}, "use mux for connection - needs only one UDP and TCP port per room")
if err := viper.BindPFlag("usemux", cmd.PersistentFlags().Lookup("usemux")); err != nil {
return err
}
cmd.PersistentFlags().String("epr", "59000-59999", "limits the pool of ephemeral ports that ICE UDP connections can allocate from")
if err := viper.BindPFlag("epr", cmd.PersistentFlags().Lookup("epr")); err != nil {
return err
@@ -147,6 +153,8 @@ func (Room) Init(cmd *cobra.Command) error {
}
func (s *Room) Set() {
s.Mux = viper.GetBool("mux")
min := uint16(59000)
max := uint16(59999)
epr := viper.GetString("epr")
+36 -10
View File
@@ -55,6 +55,7 @@ func (manager *RoomManagerCtx) Config() types.RoomsConfig {
Connections: manager.config.EprMax - manager.config.EprMin + 1,
NekoImages: manager.config.NekoImages,
StorageEnabled: manager.config.StorageEnabled,
UsesMux: manager.config.Mux,
}
}
@@ -115,27 +116,42 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
// Allocate ports
//
epr, err := manager.allocatePorts(settings.MaxConnections)
portsNeeded := settings.MaxConnections
if manager.config.Mux {
portsNeeded = 1
}
epr, err := manager.allocatePorts(portsNeeded)
if err != nil {
return "", err
}
portBindings := nat.PortMap{}
exposedPorts := nat.PortSet{
nat.Port(fmt.Sprintf("%d/tcp", frontendPort)): struct{}{},
}
for port := epr.Min; port <= epr.Max; port++ {
portKey := nat.Port(fmt.Sprintf("%d/udp", port))
portBindings[portKey] = []nat.PortBinding{
portBindings[nat.Port(fmt.Sprintf("%d/udp", port))] = []nat.PortBinding{
{
HostIP: "0.0.0.0",
HostPort: fmt.Sprintf("%d", port),
},
}
exposedPorts[portKey] = struct{}{}
// expose TCP port as well when using mux
if manager.config.Mux {
portBindings[nat.Port(fmt.Sprintf("%d/tcp", port))] = []nat.PortBinding{
{
HostIP: "0.0.0.0",
HostPort: fmt.Sprintf("%d", port),
},
}
}
}
exposedPorts := nat.PortSet{
nat.Port(fmt.Sprintf("%d/tcp", frontendPort)): struct{}{},
}
for port := range portBindings {
exposedPorts[port] = struct{}{}
}
//
@@ -229,10 +245,20 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
env := []string{
fmt.Sprintf("NEKO_BIND=:%d", frontendPort),
fmt.Sprintf("NEKO_EPR=%d-%d", epr.Min, epr.Max),
"NEKO_ICELITE=true",
}
if manager.config.Mux {
env = append(env,
fmt.Sprintf("NEKO_UDPMUX=%d", epr.Min),
fmt.Sprintf("NEKO_TCPMUX=%d", epr.Min),
)
} else {
env = append(env,
fmt.Sprintf("NEKO_EPR=%d-%d", epr.Min, epr.Max),
)
}
// optional nat mapping
if len(manager.config.NAT1To1IPs) > 0 {
env = append(env, fmt.Sprintf("NEKO_NAT1TO1=%s", strings.Join(manager.config.NAT1To1IPs, ",")))
+5 -2
View File
@@ -19,6 +19,8 @@ var blacklistedEnvs = []string{
// ignore bunch of envs managed by neko-rooms
"NEKO_BIND",
"NEKO_EPR",
"NEKO_UDPMUX",
"NEKO_TCPMUX",
"NEKO_NAT1TO1",
"NEKO_ICELITE",
}
@@ -27,6 +29,7 @@ type RoomsConfig struct {
Connections uint16 `json:"connections"`
NekoImages []string `json:"neko_images"`
StorageEnabled bool `json:"storage_enabled"`
UsesMux bool `json:"uses_mux"`
}
type RoomEntry struct {
@@ -35,7 +38,7 @@ type RoomEntry struct {
Name string `json:"name"`
NekoImage string `json:"neko_image"`
IsOutdated bool `json:"is_outdated"`
MaxConnections uint16 `json:"max_connections"`
MaxConnections uint16 `json:"max_connections"` // ignored when using mux
Running bool `json:"running"`
Status string `json:"status"`
Created time.Time `json:"created"`
@@ -66,7 +69,7 @@ type RoomResources struct {
type RoomSettings struct {
Name string `json:"name"`
NekoImage string `json:"neko_image"`
MaxConnections uint16 `json:"max_connections"`
MaxConnections uint16 `json:"max_connections"` // ignored when using mux
ControlProtection bool `json:"control_protection"`
ImplicitControl bool `json:"implicit_control"`