ephemeral.go raw

   1  package routing
   2  
   3  import (
   4  	"next.orly.dev/pkg/nostr/encoders/event"
   5  	"next.orly.dev/pkg/nostr/encoders/kind"
   6  	"next.orly.dev/pkg/lol/log"
   7  )
   8  
   9  // Publisher abstracts event delivery to subscribers.
  10  type Publisher interface {
  11  	// Deliver sends an event to all matching subscribers.
  12  	Deliver(ev *event.E)
  13  }
  14  
  15  // IsEphemeral checks if a kind is ephemeral (20000-29999).
  16  func IsEphemeral(k uint16) bool {
  17  	return kind.IsEphemeral(k)
  18  }
  19  
  20  // MakeEphemeralHandler creates a handler for ephemeral events.
  21  // Ephemeral events (kinds 20000-29999):
  22  // - Are NOT persisted to the database
  23  // - Are immediately delivered to subscribers
  24  func MakeEphemeralHandler(publisher Publisher) Handler {
  25  	return func(ev *event.E, authedPubkey []byte) Result {
  26  		log.D.F("ephemeral handler received event kind %d, id %0x", ev.Kind, ev.ID[:8])
  27  		// Clone and deliver immediately without persistence
  28  		cloned := ev.Clone()
  29  		go publisher.Deliver(cloned)
  30  		return HandledResult("")
  31  	}
  32  }
  33