1
0
Fork 0
mirror of https://git.sr.ht/~ashkeel/strimertul synced 2024-09-20 02:00:49 +00:00
strimertul/modules/stulbe/client.go

77 lines
1.5 KiB
Go
Raw Normal View History

2021-05-07 16:36:23 +00:00
package stulbe
import (
"context"
2021-05-07 16:36:23 +00:00
"github.com/sirupsen/logrus"
"github.com/strimertul/strimertul/database"
2021-05-07 16:36:23 +00:00
2021-05-11 11:12:00 +00:00
stulbe "github.com/strimertul/stulbe/client"
)
2021-05-07 16:36:23 +00:00
2021-05-11 11:12:00 +00:00
type Manager struct {
Client *stulbe.Client
db *database.DB
logger logrus.FieldLogger
2021-05-07 16:36:23 +00:00
}
2021-05-11 11:12:00 +00:00
func Initialize(db *database.DB, logger logrus.FieldLogger) (*Manager, error) {
2021-05-07 16:36:23 +00:00
var config Config
err := db.GetJSON(ConfigKey, &config)
2021-05-07 16:36:23 +00:00
if err != nil {
return nil, err
}
2021-05-11 11:12:00 +00:00
stulbeClient, err := stulbe.NewClient(stulbe.ClientOptions{
2021-05-07 16:36:23 +00:00
Endpoint: config.Endpoint,
2021-05-11 11:12:00 +00:00
Username: config.Username,
AuthKey: config.AuthKey,
Logger: logger,
})
if err != nil {
return nil, err
}
2021-05-11 11:12:00 +00:00
return &Manager{
Client: stulbeClient,
db: db,
logger: logger,
2021-05-11 11:12:00 +00:00
}, err
2021-05-07 16:36:23 +00:00
}
2021-05-11 11:12:00 +00:00
func (m *Manager) Close() {
m.Client.Close()
2021-05-07 16:36:23 +00:00
}
2021-05-11 11:12:00 +00:00
func (m *Manager) ReplicateKey(key string) error {
// Set key to current value
val, err := m.db.GetKey(key)
if err != nil {
return err
}
2021-05-11 11:12:00 +00:00
err = m.Client.KV.SetKey(key, string(val))
if err != nil {
return err
}
m.logger.WithFields(logrus.Fields{
"key": key,
}).Debug("set to remote")
// Subscribe to local datastore and update remote on change
2021-05-11 11:12:00 +00:00
return m.db.Subscribe(context.Background(), func(pairs []database.ModifiedKV) error {
for _, changed := range pairs {
2021-05-11 11:12:00 +00:00
err := m.Client.KV.SetKey(changed.Key, string(changed.Data))
if err != nil {
return err
}
m.logger.WithFields(logrus.Fields{
"key": changed.Key,
}).Debug("replicated to remote")
}
return nil
}, key)
}