aboutsummaryrefslogtreecommitdiffstats
path: root/relay/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'relay/main.go')
-rw-r--r--relay/main.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/relay/main.go b/relay/main.go
new file mode 100644
index 0000000..2cfa034
--- /dev/null
+++ b/relay/main.go
@@ -0,0 +1,72 @@
1package main
2
3import (
4 "context"
5 "errors"
6 "flag"
7 "log"
8 "net/http"
9 "os"
10 "os/signal"
11 "syscall"
12 "time"
13
14 "axon/relay/storage"
15 "axon/relay/subscription"
16)
17
18func main() {
19 cfgPath := flag.String("config", "config.yaml", "path to config.yaml")
20 flag.Parse()
21
22 cfg, err := LoadConfig(*cfgPath)
23 if err != nil {
24 log.Fatalf("relay: load config: %v", err)
25 }
26
27 allowlist, err := cfg.AllowlistBytes()
28 if err != nil {
29 log.Fatalf("relay: allowlist: %v", err)
30 }
31
32 store, err := storage.New(cfg.DB)
33 if err != nil {
34 log.Fatalf("relay: open storage: %v", err)
35 }
36 defer store.Close()
37
38 global := subscription.NewGlobalManager()
39
40 // Periodically purge closed subscriptions.
41 stopPurger := make(chan struct{})
42 global.StartPurger(5*time.Minute, stopPurger)
43 defer close(stopPurger)
44
45 srv := NewServer(cfg, allowlist, store, global)
46
47 // Graceful shutdown on SIGINT / SIGTERM.
48 sigCh := make(chan os.Signal, 1)
49 signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
50
51 errCh := make(chan error, 1)
52 go func() {
53 if err := srv.Start(); err != nil && !errors.Is(err, http.ErrServerClosed) {
54 errCh <- err
55 }
56 }()
57
58 select {
59 case sig := <-sigCh:
60 log.Printf("relay: received signal %s, shutting down", sig)
61 case err := <-errCh:
62 log.Fatalf("relay: server error: %v", err)
63 }
64
65 shutdownCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
66 defer cancel()
67
68 if err := srv.Shutdown(shutdownCtx); err != nil {
69 log.Printf("relay: shutdown error: %v", err)
70 }
71 log.Println("relay: stopped")
72}