diff --git a/OpenApi.yml b/OpenApi.yml
index 330e120..42f3ea4 100644
--- a/OpenApi.yml
+++ b/OpenApi.yml
@@ -307,6 +307,7 @@ components:
max_connections:
type: number
example: 10
+ description: 0 when using mux
running:
type: boolean
example: true
@@ -361,6 +362,7 @@ components:
max_connections:
type: number
default: 10
+ description: 0 when using mux
user_pass:
type: string
example: neko
diff --git a/client/src/components/RoomInfo.vue b/client/src/components/RoomInfo.vue
index d9c07cf..ee9109e 100644
--- a/client/src/components/RoomInfo.vue
+++ b/client/src/components/RoomInfo.vue
@@ -25,10 +25,10 @@
:rotate="270"
:size="100"
:width="15"
- :value="usesMux ? 100 : ((stats.connections / settings.max_connections) * 100)"
+ :value="settings.max_connections == 0 ? 100 : ((stats.connections / settings.max_connections) * 100)"
color="blue"
>
- {{ stats.connections }} / {{ settings.max_connections }}
+ {{ stats.connections }} / {{ settings.max_connections }}
@@ -99,7 +99,10 @@
Invite link for admins
-
| Max connections | {{ settings.max_connections }} |
+ | Max connections |
+ {{ settings.max_connections }}
+ not limited because uses mux
+ |
| Control protection | {{ settings.control_protection }} |
| Implicit Control | {{ settings.implicit_control }} |
@@ -275,8 +278,7 @@ export default class RoomInfo extends Vue {
}
get usesMux() {
- // old rooms might not use mux despite enabled server wide, simple check for that
- return this.$store.state.roomsConfig.uses_mux && this.settings?.max_connections == 1
+ return this.$store.state.roomsConfig.uses_mux
}
get allBrowserExtensions() {
diff --git a/client/src/components/RoomsCreate.vue b/client/src/components/RoomsCreate.vue
index 8546f3f..b78bd29 100644
--- a/client/src/components/RoomsCreate.vue
+++ b/client/src/components/RoomsCreate.vue
@@ -604,7 +604,7 @@ export default class RoomsCreate extends Vue {
// eslint-disable-next-line
admin_pass: this.data.admin_pass || randomPassword(),
// eslint-disable-next-line
- max_connections: Number(this.data.max_connections), // not needed when uses mux
+ max_connections: Number(this.data.max_connections), // ignored when uses mux
// eslint-disable-next-line
control_protection: Boolean(this.data.control_protection),
// eslint-disable-next-line
diff --git a/client/src/components/RoomsList.vue b/client/src/components/RoomsList.vue
index 6f92daa..95afd82 100644
--- a/client/src/components/RoomsList.vue
+++ b/client/src/components/RoomsList.vue
@@ -33,8 +33,8 @@
- {{ item.max_connections }}
- --not-specified--
+ {{ item.max_connections }}
+ uses mux
{{ item.status }}
diff --git a/client/src/views/Home.vue b/client/src/views/Home.vue
index 7aa1463..73e6923 100644
--- a/client/src/views/Home.vue
+++ b/client/src/views/Home.vue
@@ -101,7 +101,7 @@ export default class Home extends Vue {
get usedConnections() {
// eslint-disable-next-line
- return this.$store.state.rooms.reduce((sum: number, { max_connections }: RoomEntry) => sum + (max_connections || 0), 0)
+ return this.$store.state.rooms.reduce((sum: number, { max_connections }: RoomEntry) => sum + (max_connections || 1/* 0 when using mux */), 0)
}
async LoadRooms() {
diff --git a/internal/room/containers.go b/internal/room/containers.go
index 6219e03..bbf41db 100644
--- a/internal/room/containers.go
+++ b/internal/room/containers.go
@@ -18,7 +18,7 @@ func (manager *RoomManagerCtx) containerToEntry(container dockerTypes.Container)
return nil, err
}
- return &types.RoomEntry{
+ entry := &types.RoomEntry{
ID: container.ID,
URL: labels.URL,
Name: labels.Name,
@@ -28,7 +28,13 @@ func (manager *RoomManagerCtx) containerToEntry(container dockerTypes.Container)
Running: container.State == "running",
Status: container.Status,
Created: time.Unix(container.Created, 0),
- }, nil
+ }
+
+ if labels.Mux {
+ entry.MaxConnections = 0
+ }
+
+ return entry, nil
}
func (manager *RoomManagerCtx) listContainers() ([]dockerTypes.Container, error) {
diff --git a/internal/room/labels.go b/internal/room/labels.go
index 9d8ea96..745529e 100644
--- a/internal/room/labels.go
+++ b/internal/room/labels.go
@@ -10,6 +10,7 @@ import (
type RoomLabels struct {
Name string
URL string
+ Mux bool
Epr EprPorts
NekoImage string
@@ -37,24 +38,47 @@ func (manager *RoomManagerCtx) extractLabels(labels map[string]string) (*RoomLab
return nil, fmt.Errorf("damaged container labels: neko_image not found")
}
- eprMinStr, ok := labels["m1k1o.neko_rooms.epr.min"]
- if !ok {
- return nil, fmt.Errorf("damaged container labels: epr.min not found")
- }
+ var mux bool
+ var epr EprPorts
- eprMin, err := strconv.ParseUint(eprMinStr, 10, 16)
- if err != nil {
- return nil, err
- }
+ muxStr, ok := labels["m1k1o.neko_rooms.mux"]
+ if ok {
+ muxPort, err := strconv.ParseUint(muxStr, 10, 16)
+ if err != nil {
+ return nil, err
+ }
- eprMaxStr, ok := labels["m1k1o.neko_rooms.epr.max"]
- if !ok {
- return nil, fmt.Errorf("damaged container labels: epr.max not found")
- }
+ mux = true
+ epr = EprPorts{
+ Min: uint16(muxPort),
+ Max: uint16(muxPort),
+ }
+ } else {
+ eprMinStr, ok := labels["m1k1o.neko_rooms.epr.min"]
+ if !ok {
+ return nil, fmt.Errorf("damaged container labels: epr.min not found")
+ }
- eprMax, err := strconv.ParseUint(eprMaxStr, 10, 16)
- if err != nil {
- return nil, err
+ eprMin, err := strconv.ParseUint(eprMinStr, 10, 16)
+ if err != nil {
+ return nil, err
+ }
+
+ eprMaxStr, ok := labels["m1k1o.neko_rooms.epr.max"]
+ if !ok {
+ return nil, fmt.Errorf("damaged container labels: epr.max not found")
+ }
+
+ eprMax, err := strconv.ParseUint(eprMaxStr, 10, 16)
+ if err != nil {
+ return nil, err
+ }
+
+ mux = false
+ epr = EprPorts{
+ Min: uint16(eprMin),
+ Max: uint16(eprMax),
+ }
}
var browserPolicy *BrowserPolicyLabels
@@ -79,10 +103,9 @@ func (manager *RoomManagerCtx) extractLabels(labels map[string]string) (*RoomLab
Name: name,
URL: url,
NekoImage: nekoImage,
- Epr: EprPorts{
- Min: uint16(eprMin),
- Max: uint16(eprMax),
- },
+ Mux: mux,
+ Epr: epr,
+
BrowserPolicy: browserPolicy,
}, nil
}
@@ -91,8 +114,6 @@ func (manager *RoomManagerCtx) serializeLabels(labels RoomLabels) map[string]str
labelsMap := map[string]string{
"m1k1o.neko_rooms.name": labels.Name,
"m1k1o.neko_rooms.instance": manager.config.InstanceName,
- "m1k1o.neko_rooms.epr.min": fmt.Sprintf("%d", labels.Epr.Min),
- "m1k1o.neko_rooms.epr.max": fmt.Sprintf("%d", labels.Epr.Max),
"m1k1o.neko_rooms.neko_image": labels.NekoImage,
}
@@ -101,6 +122,13 @@ func (manager *RoomManagerCtx) serializeLabels(labels RoomLabels) map[string]str
labelsMap["m1k1o.neko_rooms.url"] = manager.config.GetRoomUrl(labels.Name)
}
+ if labels.Mux && labels.Epr.Min == labels.Epr.Max {
+ labelsMap["m1k1o.neko_rooms.mux"] = fmt.Sprintf("%d", labels.Epr.Min)
+ } else {
+ labelsMap["m1k1o.neko_rooms.epr.min"] = fmt.Sprintf("%d", labels.Epr.Min)
+ labelsMap["m1k1o.neko_rooms.epr.max"] = fmt.Sprintf("%d", labels.Epr.Max)
+ }
+
if labels.BrowserPolicy != nil {
labelsMap["m1k1o.neko_rooms.browser_policy"] = "true"
labelsMap["m1k1o.neko_rooms.browser_policy.type"] = string(labels.BrowserPolicy.Type)
diff --git a/internal/room/manager.go b/internal/room/manager.go
index 0ae815e..3766b63 100644
--- a/internal/room/manager.go
+++ b/internal/room/manager.go
@@ -170,6 +170,7 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
labels := manager.serializeLabels(RoomLabels{
Name: roomName,
+ Mux: manager.config.Mux,
Epr: epr,
NekoImage: settings.NekoImage,
@@ -570,6 +571,10 @@ func (manager *RoomManagerCtx) GetSettings(id string) (*types.RoomSettings, erro
Resources: roomResources,
}
+ if labels.Mux {
+ settings.MaxConnections = 0
+ }
+
err = settings.FromEnv(container.Config.Env)
return &settings, err
}
diff --git a/internal/types/room.go b/internal/types/room.go
index e0e266d..2e7ab5a 100644
--- a/internal/types/room.go
+++ b/internal/types/room.go
@@ -38,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"` // ignored when using mux
+ MaxConnections uint16 `json:"max_connections"` // 0 when using mux
Running bool `json:"running"`
Status string `json:"status"`
Created time.Time `json:"created"`
@@ -69,7 +69,7 @@ type RoomResources struct {
type RoomSettings struct {
Name string `json:"name"`
NekoImage string `json:"neko_image"`
- MaxConnections uint16 `json:"max_connections"` // ignored when using mux
+ MaxConnections uint16 `json:"max_connections"` // 0 when using mux
ControlProtection bool `json:"control_protection"`
ImplicitControl bool `json:"implicit_control"`