mirror of
https://git.sr.ht/~ashkeel/strimertul
synced 2024-09-20 02:00:49 +00:00
69 lines
1.2 KiB
Go
69 lines
1.2 KiB
Go
package stulbe
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/strimertul/strimertul/database"
|
|
|
|
stulbe "github.com/strimertul/stulbe/client"
|
|
)
|
|
|
|
type Manager struct {
|
|
Client *stulbe.Client
|
|
db *database.DB
|
|
}
|
|
|
|
func Initialize(db *database.DB, logger logrus.FieldLogger) (*Manager, error) {
|
|
var config Config
|
|
err := db.GetJSON(ConfigKey, &config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
stulbeClient, err := stulbe.NewClient(stulbe.ClientOptions{
|
|
Endpoint: config.Endpoint,
|
|
Username: config.Username,
|
|
AuthKey: config.AuthKey,
|
|
Logger: logger,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Manager{
|
|
Client: stulbeClient,
|
|
db: db,
|
|
}, err
|
|
}
|
|
|
|
func (m *Manager) Close() {
|
|
m.Client.Close()
|
|
}
|
|
|
|
func (m *Manager) ReplicateKey(key string) error {
|
|
// Set key to current value
|
|
val, err := m.db.GetKey(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = m.Client.KV.SetKey(key, string(val))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Subscribe to local datastore and update remote on change
|
|
return m.db.Subscribe(context.Background(), func(pairs []database.ModifiedKV) error {
|
|
for _, changed := range pairs {
|
|
err := m.Client.KV.SetKey(changed.Key, string(changed.Data))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}, key)
|
|
}
|