From 32dd39da81f305aa7955bd2a08387483b578970b Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sun, 22 Feb 2026 18:02:22 -0300 Subject: [PATCH] sdk: fix default Publisher to work with any store. --- eventstore/wrappers/dynamic_publisher.go | 40 ++++++++++++++++++++++++ sdk/system.go | 4 +-- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 eventstore/wrappers/dynamic_publisher.go diff --git a/eventstore/wrappers/dynamic_publisher.go b/eventstore/wrappers/dynamic_publisher.go new file mode 100644 index 0000000..baae390 --- /dev/null +++ b/eventstore/wrappers/dynamic_publisher.go @@ -0,0 +1,40 @@ +package wrappers + +import ( + "context" + "fmt" + "iter" + + "fiatjaf.com/nostr" + "fiatjaf.com/nostr/eventstore" +) + +var _ nostr.Publisher = DynamicPublisher{} + +type DynamicPublisher struct { + GetStore func() eventstore.Store + MaxLimit int +} + +func (w DynamicPublisher) QueryEvents(filter nostr.Filter) iter.Seq[nostr.Event] { + return w.GetStore().QueryEvents(filter, w.MaxLimit) +} + +func (w DynamicPublisher) Publish(ctx context.Context, evt nostr.Event) error { + if evt.Kind.IsEphemeral() { + return nil + } + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + if evt.Kind.IsRegular() { + if err := w.GetStore().SaveEvent(evt); err != nil && err != eventstore.ErrDupEvent { + return fmt.Errorf("failed to save: %w", err) + } else { + return err + } + } + + return w.GetStore().ReplaceEvent(evt) +} diff --git a/sdk/system.go b/sdk/system.go index f100f5f..1d4e39d 100644 --- a/sdk/system.go +++ b/sdk/system.go @@ -72,7 +72,7 @@ type System struct { NoteSearchRelays *RelayStream Store eventstore.Store - Publisher wrappers.StorePublisher + Publisher nostr.Publisher replaceableLoaders []*dataloader.Loader[nostr.PubKey, nostr.Event] addressableLoaders []*dataloader.Loader[nostr.PubKey, []nostr.Event] @@ -178,7 +178,7 @@ func NewSystem() *System { sys.Store = &nullstore.NullStore{} sys.Store.Init() } - sys.Publisher = wrappers.StorePublisher{Store: sys.Store, MaxLimit: 1000} + sys.Publisher = wrappers.DynamicPublisher{GetStore: func() eventstore.Store { return sys.Store }, MaxLimit: 1000} sys.initializeReplaceableDataloaders() sys.initializeAddressableDataloaders()