forked from empiricaly/empirica
-
Notifications
You must be signed in to change notification settings - Fork 0
/
empirica.go
103 lines (80 loc) · 2.57 KB
/
empirica.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
package empirica
import (
"context"
"github.com/99designs/gqlgen/graphql"
"github.com/empiricaly/empirica/internal/callbacks"
"github.com/empiricaly/empirica/internal/player"
"github.com/empiricaly/empirica/internal/server"
"github.com/empiricaly/empirica/internal/term"
logger "github.com/empiricaly/empirica/internal/utils/log"
"github.com/empiricaly/tajriba"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
"github.com/spf13/viper"
)
// Runner manages Empirica's running state.
type Runner struct {
server *server.Server
player *player.Player
callbacks *callbacks.Callbacks
taj *tajriba.Runner
}
// Close waits for empirica to be done.
func (r *Runner) Close(ctx context.Context) {
if r.server != nil {
r.server.Wait()
log.Debug().Msg("empirica: server stopped")
}
if r.taj != nil {
r.taj.Close()
log.Debug().Msg("empirica: tajriba stopped")
}
}
// Start sets up the Empirica environment and creates an HTTP server.
func Start(ctx context.Context, config *Config, usingConfigFile bool) (*Runner, error) {
err := logger.Init(config.Log)
if err != nil {
return nil, errors.Wrap(err, "init logs")
}
if usingConfigFile {
log.Trace().Str("file", viper.ConfigFileUsed()).Msg("Using config file")
}
log.Trace().Interface("config", config).Msg("Configuration")
r := &Runner{}
var schema graphql.ExecutableSchema
termui := term.New(config.Log.Level == "debug" || config.Log.Level == "trace")
ctx = term.SetContext(ctx, termui)
comp := termui.Add("tajriba")
ctx, r.taj, schema, err = tajriba.Setup(ctx, config.Tajriba, usingConfigFile)
if err != nil {
log.Fatal().Err(err).Msg("failed to start tajriba")
}
// Pass down if production
config.Server.Production = config.Production
if r.server, err = server.Prepare(config.Server); err != nil {
return nil, errors.Wrap(err, "prepare server")
}
r.player, err = player.Start(ctx, config.Player)
if err != nil {
return nil, errors.Wrap(err, "init player")
}
termui.Start()
config.Callbacks.Token = config.Tajriba.Auth.ServiceRegistrationToken
config.Tajriba.Server.Production = config.Production
r.callbacks, err = callbacks.Start(ctx, config.Callbacks)
if err != nil {
return nil, errors.Wrap(err, "init callbacks")
}
if err := server.Enable(ctx, config.Server, r.server.Router); err != nil {
return nil, errors.Wrap(err, "enable server")
}
err = r.taj.Init(schema, r.server.Router)
if err != nil {
log.Fatal().Err(err).Msg("failed to start tajriba")
}
if err := r.server.Start(ctx); err != nil {
return nil, errors.Wrap(err, "start server")
}
comp.Ready()
return r, nil
}