actorifiedstore.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package store
  2. import (
  3. "context"
  4. "time"
  5. "github.com/TecharoHQ/anubis/internal/actorify"
  6. )
  7. type unit struct{}
  8. type ActorifiedStore struct {
  9. Interface
  10. deleteActor *actorify.Actor[string, unit]
  11. getActor *actorify.Actor[string, []byte]
  12. setActor *actorify.Actor[*actorSetReq, unit]
  13. cancel context.CancelFunc
  14. }
  15. type actorSetReq struct {
  16. key string
  17. value []byte
  18. expiry time.Duration
  19. }
  20. func NewActorifiedStore(backend Interface) *ActorifiedStore {
  21. ctx, cancel := context.WithCancel(context.Background())
  22. result := &ActorifiedStore{
  23. Interface: backend,
  24. cancel: cancel,
  25. }
  26. result.deleteActor = actorify.New(ctx, result.actorDelete)
  27. result.getActor = actorify.New(ctx, backend.Get)
  28. result.setActor = actorify.New(ctx, result.actorSet)
  29. return result
  30. }
  31. func (a *ActorifiedStore) Close() { a.cancel() }
  32. func (a *ActorifiedStore) Delete(ctx context.Context, key string) error {
  33. if _, err := a.deleteActor.Call(ctx, key); err != nil {
  34. return err
  35. }
  36. return nil
  37. }
  38. func (a *ActorifiedStore) Get(ctx context.Context, key string) ([]byte, error) {
  39. return a.getActor.Call(ctx, key)
  40. }
  41. func (a *ActorifiedStore) Set(ctx context.Context, key string, value []byte, expiry time.Duration) error {
  42. if _, err := a.setActor.Call(ctx, &actorSetReq{
  43. key: key,
  44. value: value,
  45. expiry: expiry,
  46. }); err != nil {
  47. return err
  48. }
  49. return nil
  50. }
  51. func (a *ActorifiedStore) actorDelete(ctx context.Context, key string) (unit, error) {
  52. if err := a.Interface.Delete(ctx, key); err != nil {
  53. return unit{}, err
  54. }
  55. return unit{}, nil
  56. }
  57. func (a *ActorifiedStore) actorSet(ctx context.Context, req *actorSetReq) (unit, error) {
  58. if err := a.Interface.Set(ctx, req.key, req.value, req.expiry); err != nil {
  59. return unit{}, err
  60. }
  61. return unit{}, nil
  62. }