mirror of
https://github.com/m1k1o/neko-rooms.git
synced 2026-11-02 22:51:34 -06:00
Add mux support. (#58)
* add mux support. * usemux to mux. * lint fix. * dev script mux. * add mux to readme.
This commit is contained in:
@@ -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
@@ -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, ",")))
|
||||
|
||||
@@ -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"`
|
||||
|
||||
Reference in New Issue
Block a user