@@ -100,7 +100,9 @@ const (
100100
101101 wsbestloc = "/BestLocation"
102102
103- maxPerRegionWgConfs = 4
103+ wsMinServerLinkSpeed = 1 // 1mbps
104+ wsMaxServerHealth = 100 // min is 0
105+ maxPerRegionWgConfs = 4
104106)
105107
106108// github.com/Windscribe/Android-App/blob/746d505dc69/base/src/main/java/com/windscribe/vpn/constants/NetworkErrorCodes.kt
@@ -1038,14 +1040,29 @@ func convertToRegionalWgConfs(id *WsWgCreds, reservation *WsWgConnectData, list
10381040 return nil , errWsNoServerList
10391041 }
10401042
1043+ tot := make (map [string ]int )
10411044 out := make ([]* RegionalWgConf , 0 , len (list ))
10421045 for _ , server := range list {
10431046 if skipWsServer (server ) {
10441047 continue
10451048 }
10461049
1050+ cc := server .CountryCode
10471051 port := wsRandomPort ()
1048- for _ , group := range server .Groups {
1052+ sorted := core .Sort (server .Groups , func (a , b WsServerGroup ) int {
1053+ ia , _ := strconv .ParseInt (a .LinkSpeed , 10 , 64 )
1054+ ib , _ := strconv .ParseInt (b .LinkSpeed , 10 , 64 )
1055+ la := min (int (ia ), wsMinServerLinkSpeed ) * (wsMaxServerHealth - a .Health )
1056+ lb := min (int (ib ), wsMinServerLinkSpeed ) * (wsMaxServerHealth - b .Health )
1057+ if la < lb { // ascending order by Health (lower is healthier)
1058+ return - 1
1059+ } else if la > lb {
1060+ return 1
1061+ }
1062+ return 0
1063+ })
1064+
1065+ for _ , group := range sorted {
10491066 servername := group .City + " (" + group .Nick + ")"
10501067 if len (group .WgPubKey ) <= 0 || len (group .WgEndpoint ) <= 0 {
10511068 continue // skip servers without wg
@@ -1054,6 +1071,12 @@ func convertToRegionalWgConfs(id *WsWgCreds, reservation *WsWgConnectData, list
10541071 log .W ("ws: wgconfs: no nodes in %s (%s)" , group .City , group .Nick )
10551072 continue // skip servers without nodes
10561073 }
1074+ if tot [cc ] >= maxPerRegionWgConfs * 2 {
1075+ log .D ("ws: wgconfs: skip! %s (%s) has %d configs already" ,
1076+ cc , servername , tot [cc ])
1077+ break // we have enough configs for this region
1078+ }
1079+ tot [cc ] = tot [cc ] + 1
10571080 out = append (out , & RegionalWgConf {
10581081 CC : server .CountryCode ,
10591082 Name : servername ,
@@ -1069,6 +1092,7 @@ func convertToRegionalWgConfs(id *WsWgCreds, reservation *WsWgConnectData, list
10691092 AllowedIPs : []string {gw4 },
10701093 })
10711094 }
1095+
10721096 }
10731097
10741098 if len (out ) <= 0 {
0 commit comments