Add support for state for Service{} (#142)

Co-authored-by: James Mills <prologic@shortcircuit.net.au>
Reviewed-on: https://git.mills.io/saltyim/saltyim/pulls/142
This commit is contained in:
James Mills 2022-04-04 03:42:54 +00:00
parent 35aa48c273
commit f3a847674c
4 changed files with 23 additions and 10 deletions

View File

@ -380,7 +380,9 @@ func (cli *Client) SendToAddr(addr *Addr, msg string) error {
return fmt.Errorf("error encrypting message to %s: %w", addr, err)
}
if err := cli.send.Send(cli.key, addr.Endpoint().String(), string(b), addr.Cap()); err != nil {
endpoint := addr.Endpoint().String()
log.Debugf("sending message to %s", endpoint)
if err := cli.send.Send(cli.key, endpoint, string(b), addr.Cap()); err != nil {
return fmt.Errorf("error sending message to %s: %w", addr, err)
}

View File

@ -230,6 +230,7 @@ func (s *Server) setupCronJobs() error {
func (s *Server) setupServiceUser() error {
svcUser := fmt.Sprintf("%s@%s", serviceUser, s.config.PrimaryDomain)
svcUserState := filepath.Join(s.config.Data, fmt.Sprintf("%s.json", serviceUser))
log.Infof("starting service user %s", svcUser)
@ -253,7 +254,7 @@ func (s *Server) setupServiceUser() error {
return err
}
svc, err := saltyim.NewService(me, id)
svc, err := saltyim.NewService(me, id, svcUserState)
if err != nil {
return err
}

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ca99155251db2adc7e6f8ffbad0d775d32ff5be8cdbe6cbf87f4a5638f0a77a3
size 29219202
oid sha256:06677a6e69b34dd4d02e915ebb9ffb3264787cfe676e30c546e70743bebc6708
size 29222154

View File

@ -17,10 +17,10 @@ import (
type Service struct {
mu sync.RWMutex
me *Addr
id *Identity
cli *Client
me *Addr
id *Identity
cli *Client
state string
textFns map[string]MessageTextHandlerFunc
eventFns map[string]MessageEventHandlerFunc
@ -29,10 +29,11 @@ type Service struct {
type MessageTextHandlerFunc func(context.Context, *Service, *keys.EdX25519PublicKey, *lextwt.SaltyText) error
type MessageEventHandlerFunc func(context.Context, *Service, *keys.EdX25519PublicKey, *lextwt.SaltyEvent) error
func NewService(me *Addr, id *Identity) (*Service, error) {
func NewService(me *Addr, id *Identity, state string) (*Service, error) {
svc := &Service{
me: me,
id: id,
state: state,
textFns: make(map[string]MessageTextHandlerFunc),
eventFns: make(map[string]MessageEventHandlerFunc),
}
@ -76,7 +77,11 @@ func (svc *Service) Run(ctx context.Context) error {
// create the service user's client in a loop until successful
// TODO: Should this timeout? Use a context?
if err := retry.Do(func() error {
cli, err := NewClient(svc.me, WithClientIdentity(WithIdentity(svc.id)))
cli, err := NewClient(
svc.me,
WithStateFromFile(svc.state),
WithClientIdentity(WithIdentity(svc.id)),
)
if err != nil {
return err
}
@ -93,6 +98,11 @@ func (svc *Service) Run(ctx context.Context) error {
); err != nil {
return fmt.Errorf("error setting up service user %s: %w", svc.me, err)
}
defer func() {
if err := svc.cli.State().Save(svc.state); err != nil {
log.WithError(err).Warnf("error saving state: %s", svc.state)
}
}()
log.Debugf("listening for service requests as %s", svc.me)