event.mx raw

   1  package envelope
   2  
   3  import (
   4  	"io"
   5  
   6  	"smesh.lol/pkg/nostr/event"
   7  	"smesh.lol/pkg/nostr/text"
   8  	"smesh.lol/pkg/nostr/units"
   9  	"smesh.lol/pkg/lol/chk"
  10  )
  11  
  12  const EventLabel = "EVENT"
  13  
  14  // EventSubmission is a client request to store an event.
  15  type EventSubmission struct{ *event.E }
  16  
  17  func (en *EventSubmission) Label() string { return EventLabel }
  18  func (en *EventSubmission) Id() []byte    { return en.E.ID }
  19  
  20  func (en *EventSubmission) Write(w io.Writer) (err error) {
  21  	_, err = w.Write(en.Marshal(nil))
  22  	return
  23  }
  24  
  25  func (en *EventSubmission) Marshal(dst []byte) (b []byte) {
  26  	if en.EstimateSize() >= cap(dst) {
  27  		dst = []byte{:0:en.EstimateSize()+units.Kb}
  28  	}
  29  	b = dst
  30  	b = Marshal(b, EventLabel, func(bst []byte) (o []byte) {
  31  		return en.E.Marshal(bst)
  32  	})
  33  	return
  34  }
  35  
  36  func (en *EventSubmission) Unmarshal(b []byte) (r []byte, err error) {
  37  	r = b
  38  	en.E = event.New()
  39  	if r, err = en.E.Unmarshal(r); chk.T(err) {
  40  		return
  41  	}
  42  	r, err = SkipToTheEnd(r)
  43  	return
  44  }
  45  
  46  // EventResult is an event matching a subscription filter.
  47  type EventResult struct {
  48  	Subscription []byte
  49  	Event        *event.E
  50  }
  51  
  52  func (en *EventResult) Label() string { return EventLabel }
  53  func (en *EventResult) Id() []byte    { return en.Event.ID }
  54  
  55  func (en *EventResult) Write(w io.Writer) (err error) {
  56  	_, err = w.Write(en.Marshal(nil))
  57  	return
  58  }
  59  
  60  func (en *EventResult) Marshal(dst []byte) (b []byte) {
  61  	if en.Event.EstimateSize() >= cap(dst) {
  62  		dst = []byte{:0:en.Event.EstimateSize()+units.Kb}
  63  	}
  64  	b = dst
  65  	b = Marshal(b, EventLabel, func(bst []byte) (o []byte) {
  66  		o = bst
  67  		o = append(o, '"')
  68  		o = append(o, en.Subscription...)
  69  		o = append(o, '"', ',')
  70  		o = en.Event.Marshal(o)
  71  		return
  72  	})
  73  	return
  74  }
  75  
  76  func (en *EventResult) Unmarshal(b []byte) (r []byte, err error) {
  77  	r = b
  78  	if en.Subscription, r, err = text.UnmarshalQuoted(r); chk.E(err) {
  79  		return
  80  	}
  81  	en.Event = event.New()
  82  	if r, err = en.Event.Unmarshal(r); err != nil {
  83  		return
  84  	}
  85  	r, err = SkipToTheEnd(r)
  86  	return
  87  }
  88