-
Notifications
You must be signed in to change notification settings - Fork 21
/
main.go
119 lines (107 loc) · 3.12 KB
/
main.go
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright (C) 2023, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package main
import (
"context"
"encoding/json"
"fmt"
"net"
"os"
"os/signal"
"sync"
"syscall"
"time"
"github.com/AnomalyFi/hypersdk/server"
"github.com/AnomalyFi/hypersdk/utils"
"github.com/AnomalyFi/nodekit-seq/cmd/token-feed/config"
"github.com/AnomalyFi/nodekit-seq/cmd/token-feed/manager"
frpc "github.com/AnomalyFi/nodekit-seq/cmd/token-feed/rpc"
"github.com/ava-labs/avalanchego/snow/engine/common"
"github.com/ava-labs/avalanchego/utils/logging"
"go.uber.org/zap"
)
var (
allowedOrigins = []string{"*"}
allowedHosts = []string{"*"}
shutdownTimeout = 30 * time.Second
httpConfig = server.HTTPConfig{
ReadTimeout: 30 * time.Second,
ReadHeaderTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
IdleTimeout: 120 * time.Second,
}
)
func fatal(l logging.Logger, msg string, fields ...zap.Field) {
l.Fatal(msg, fields...)
os.Exit(1)
}
func main() {
logFactory := logging.NewFactory(logging.Config{
DisplayLevel: logging.Info,
})
l, err := logFactory.Make("main")
if err != nil {
utils.Outf("{{red}}unable to initialize logger{{/}}: %v\n", err)
os.Exit(1)
}
log := l
// Load config
if len(os.Args) != 2 {
fatal(log, "no config file specified")
}
configPath := os.Args[1]
rawConfig, err := os.ReadFile(configPath)
if err != nil {
fatal(log, "cannot open config file", zap.String("path", configPath), zap.Error(err))
}
var c config.Config
if err := json.Unmarshal(rawConfig, &c); err != nil {
fatal(log, "cannot read config file", zap.Error(err))
}
// Load recipient
if _, err := c.RecipientPublicKey(); err != nil {
fatal(log, "cannot parse recipient address", zap.Error(err))
}
log.Info("loaded feed recipient", zap.String("address", c.Recipient))
// Create server
listenAddress := net.JoinHostPort(c.HTTPHost, fmt.Sprintf("%d", c.HTTPPort))
listener, err := net.Listen("tcp", listenAddress)
if err != nil {
fatal(log, "cannot create listener", zap.Error(err))
}
srv, err := server.New("", log, listener, httpConfig, allowedOrigins, allowedHosts, shutdownTimeout)
if err != nil {
fatal(log, "cannot create server", zap.Error(err))
}
// Start manager
manager, err := manager.New(log, &c)
if err != nil {
fatal(log, "cannot create manager", zap.Error(err))
}
go func() {
if err := manager.Run(context.Background()); err != nil {
log.Error("manager error", zap.Error(err))
}
}()
// Add feed handler
feedServer := frpc.NewJSONRPCServer(manager)
handler, err := server.NewHandler(feedServer, "feed")
if err != nil {
fatal(log, "cannot create handler", zap.Error(err))
}
if err := srv.AddRoute(&common.HTTPHandler{
LockOptions: common.NoLock,
Handler: handler,
}, &sync.RWMutex{}, "feed", ""); err != nil {
fatal(log, "cannot add facuet route", zap.Error(err))
}
// Start server
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
sig := <-sigs
log.Info("triggering server shutdown", zap.Any("signal", sig))
_ = srv.Shutdown()
}()
log.Info("server exited", zap.Error(srv.Dispatch()))
}