diff --git a/.gitignore b/.gitignore index b8da24a..d69fc94 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /gtfs.zip /pretend-feed.bin /tmp/ +/bin diff --git a/Makefile b/Makefile index a011a2a..3a4169c 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,8 @@ +all: bin + +bin: cmd/main.go proto/*.go + go build -o bin cmd/main.go + proto: proto/schema.pb.go proto/gtfs-realtime.pb.go proto/gtfs-realtime.pb.go: proto/gtfs-realtime.proto diff --git a/cmd/main.go b/cmd/main.go index 3a4f2ce..04ae7ec 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "database/sql" + "errors" "fmt" "io" "log" @@ -10,6 +11,7 @@ import ( "os" "strconv" "strings" + "time" pb "github.com/cjdenio/uta-trax-api/proto" "google.golang.org/protobuf/proto" @@ -19,6 +21,8 @@ import ( var scheduleDb *sql.DB +var gtfsRtCache []byte + func distance(lat1 float64, lng1 float64, lat2 float64, lng2 float64) float64 { radlat1 := float64(math.Pi * lat1 / 180) radlat2 := float64(math.Pi * lat2 / 180) @@ -94,13 +98,21 @@ func fetchVehicleFeed() ([]byte, error) { } func getVehicles() ([]*pb.VehiclePosition, *pb.FeedHeader, error) { - bytes, err := fetchVehicleFeed() - if err != nil { - return nil, nil, err + var bytes []byte + + if len(gtfsRtCache) > 0 { + bytes = gtfsRtCache + } else { + return nil, nil, errors.New("no cache") + var err error + bytes, err = fetchVehicleFeed() + if err != nil { + return nil, nil, err + } } feed := pb.FeedMessage{} - err = proto.Unmarshal(bytes, &feed) + err := proto.Unmarshal(bytes, &feed) if err != nil { return nil, nil, err } @@ -211,6 +223,19 @@ func main() { scheduleDb = _db + go func() { + for { + feed, err := fetchVehicleFeed() + if err == nil { + gtfsRtCache = feed + log.Println("refreshed cache") + } else { + log.Println(err) + } + time.Sleep(1 * time.Second) + } + }() + http.Handle("/", http.FileServer(http.Dir("./static"))) http.HandleFunc("/schema.proto", func(w http.ResponseWriter, r *http.Request) {