Skip to content
Snippets Groups Projects
Select Git revision
  • dd93cd685db98ccc4bffc6dac0e5a1b268d5da20
  • main default protected
2 results

server.go

Blame
  • Serge Bazanski's avatar
    q3k authored
    dd93cd68
    History
    server.go 1.57 KiB
    package main
    
    import (
    	"context"
    	"log"
    	"sync"
    	"time"
    
    	"github.com/go-git/go-git/v5"
    )
    
    type server struct {
    	reqC chan *req
    
    	cacheMu sync.RWMutex
    	cache   map[string]map[string][]byte
    
    	gitMu     sync.Mutex
    	appRepo   *git.Repository
    	lastFetch time.Time
    }
    
    type req struct {
    	getReleases    chan []GLRelease
    	getAppRegistry chan []*appDescriptor
    }
    
    func (s *server) run(ctx context.Context) {
    	releases, err := getReleases(ctx)
    	if err != nil {
    		log.Fatalf("Initial release fetch failed: %v", err)
    	}
    	appRegistry, err := s.getAppRegistry(ctx)
    	if err != nil {
    		log.Fatalf("Initial app fetch failed: %v", err)
    	}
    
    	t := time.NewTicker(60 * time.Second)
    	for {
    		select {
    		case r := <-s.reqC:
    			if r.getReleases != nil {
    				r.getReleases <- releases
    			}
    			if r.getAppRegistry != nil {
    				r.getAppRegistry <- appRegistry
    			}
    		case <-t.C:
    			releases, err = getReleases(ctx)
    			if err != nil {
    				log.Printf("Failed to fetch releases: %v", err)
    			}
    			appRegistry, err = s.getAppRegistry(ctx)
    			if err != nil {
    				log.Printf("Failed to fetch app registry: %v", err)
    			}
    		}
    	}
    }
    
    func (s *server) getReleases(ctx context.Context) ([]GLRelease, error) {
    	sresC := make(chan []GLRelease)
    	select {
    	case s.reqC <- &req{getReleases: sresC}:
    		releases := <-sresC
    		return releases, nil
    	case <-ctx.Done():
    		return nil, ctx.Err()
    	}
    }
    
    func (s *server) getApps(ctx context.Context) ([]*appDescriptor, error) {
    	sresC := make(chan []*appDescriptor)
    	select {
    	case s.reqC <- &req{getAppRegistry: sresC}:
    		res := <-sresC
    		return res, nil
    	case <-ctx.Done():
    		return nil, ctx.Err()
    	}
    }