|
|
@@ -51,6 +51,12 @@ type EFAClient interface {
|
|
|
|
BuildRequest(string) (*http.Request, error)
|
|
|
|
BuildRequest(string) (*http.Request, error)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var allEfaClients []EFAClient = []EFAClient{
|
|
|
|
|
|
|
|
BwegtEFAClient{},
|
|
|
|
|
|
|
|
VRNEFAClient{},
|
|
|
|
|
|
|
|
KVVEFAClient{},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type VRNEFAClient struct {
|
|
|
|
type VRNEFAClient struct {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -181,7 +187,7 @@ type Departure struct {
|
|
|
|
Symbol string `json:"symbol"`
|
|
|
|
Symbol string `json:"symbol"`
|
|
|
|
Direction string `json:"direction"`
|
|
|
|
Direction string `json:"direction"`
|
|
|
|
Leaving string `json:"leaving"`
|
|
|
|
Leaving string `json:"leaving"`
|
|
|
|
Countdown int
|
|
|
|
Countdown int `json:"-"`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func ParseDepartures(response DMResponse, allowedPlatform *string) (Departures, error) {
|
|
|
|
func ParseDepartures(response DMResponse, allowedPlatform *string) (Departures, error) {
|
|
|
@@ -240,15 +246,18 @@ func ParseDepartures(response DMResponse, allowedPlatform *string) (Departures,
|
|
|
|
func main() {
|
|
|
|
func main() {
|
|
|
|
password := os.Getenv("VRNP_PASSWORD")
|
|
|
|
password := os.Getenv("VRNP_PASSWORD")
|
|
|
|
if len(password) == 0 {
|
|
|
|
if len(password) == 0 {
|
|
|
|
panic("Required environment variable VRNP_PASSWORD is not set")
|
|
|
|
log.Fatal("Required environment variable VRNP_PASSWORD is not set")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clientAllowlist := strings.Split(os.Getenv("VRNP_CLIENT_ALLOWLIST"), ",")
|
|
|
|
|
|
|
|
|
|
|
|
// Use round-robin to send incoming requests to different servers
|
|
|
|
// Use round-robin to send incoming requests to different servers
|
|
|
|
var efaClient atomic.Uint64
|
|
|
|
var efaClient atomic.Uint64
|
|
|
|
efaClients := []EFAClient{
|
|
|
|
var efaClients []EFAClient
|
|
|
|
BwegtEFAClient{},
|
|
|
|
for _, efaClient := range allEfaClients {
|
|
|
|
VRNEFAClient{},
|
|
|
|
if len(clientAllowlist) != 0 && slices.Contains(clientAllowlist, efaClient.GetName()) {
|
|
|
|
KVVEFAClient{},
|
|
|
|
efaClients = append(efaClients, efaClient)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
http.HandleFunc("/departures", func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
http.HandleFunc("/departures", func(w http.ResponseWriter, r *http.Request) {
|
|
|
@@ -272,8 +281,7 @@ func main() {
|
|
|
|
platform = &query["platform"][0]
|
|
|
|
platform = &query["platform"][0]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c := efaClients[(efaClient.Add(1) - 1) % uint64(len(efaClients))]
|
|
|
|
c := efaClients[(efaClient.Add(1)-1)%uint64(len(efaClients))]
|
|
|
|
log.Print(c.GetName())
|
|
|
|
|
|
|
|
ds, err := FetchDepartures(c, stopId)
|
|
|
|
ds, err := FetchDepartures(c, stopId)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|