aboutsummaryrefslogtreecommitdiffstats
path: root/relay/main.go
blob: 2cfa034d35b15b53a38be04abced7cd3d2b3133c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main

import (
	"context"
	"errors"
	"flag"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"axon/relay/storage"
	"axon/relay/subscription"
)

func main() {
	cfgPath := flag.String("config", "config.yaml", "path to config.yaml")
	flag.Parse()

	cfg, err := LoadConfig(*cfgPath)
	if err != nil {
		log.Fatalf("relay: load config: %v", err)
	}

	allowlist, err := cfg.AllowlistBytes()
	if err != nil {
		log.Fatalf("relay: allowlist: %v", err)
	}

	store, err := storage.New(cfg.DB)
	if err != nil {
		log.Fatalf("relay: open storage: %v", err)
	}
	defer store.Close()

	global := subscription.NewGlobalManager()

	// Periodically purge closed subscriptions.
	stopPurger := make(chan struct{})
	global.StartPurger(5*time.Minute, stopPurger)
	defer close(stopPurger)

	srv := NewServer(cfg, allowlist, store, global)

	// Graceful shutdown on SIGINT / SIGTERM.
	sigCh := make(chan os.Signal, 1)
	signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)

	errCh := make(chan error, 1)
	go func() {
		if err := srv.Start(); err != nil && !errors.Is(err, http.ErrServerClosed) {
			errCh <- err
		}
	}()

	select {
	case sig := <-sigCh:
		log.Printf("relay: received signal %s, shutting down", sig)
	case err := <-errCh:
		log.Fatalf("relay: server error: %v", err)
	}

	shutdownCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	if err := srv.Shutdown(shutdownCtx); err != nil {
		log.Printf("relay: shutdown error: %v", err)
	}
	log.Println("relay: stopped")
}