package envelope import ( "io" "smesh.lol/pkg/nostr/event" "smesh.lol/pkg/nostr/text" "smesh.lol/pkg/nostr/units" "smesh.lol/pkg/lol/chk" ) const EventLabel = "EVENT" // EventSubmission is a client request to store an event. type EventSubmission struct{ *event.E } func (en *EventSubmission) Label() string { return EventLabel } func (en *EventSubmission) Id() []byte { return en.E.ID } func (en *EventSubmission) Write(w io.Writer) (err error) { _, err = w.Write(en.Marshal(nil)) return } func (en *EventSubmission) Marshal(dst []byte) (b []byte) { if en.EstimateSize() >= cap(dst) { dst = []byte{:0:en.EstimateSize()+units.Kb} } b = dst b = Marshal(b, EventLabel, func(bst []byte) (o []byte) { return en.E.Marshal(bst) }) return } func (en *EventSubmission) Unmarshal(b []byte) (r []byte, err error) { r = b en.E = event.New() if r, err = en.E.Unmarshal(r); chk.T(err) { return } r, err = SkipToTheEnd(r) return } // EventResult is an event matching a subscription filter. type EventResult struct { Subscription []byte Event *event.E } func (en *EventResult) Label() string { return EventLabel } func (en *EventResult) Id() []byte { return en.Event.ID } func (en *EventResult) Write(w io.Writer) (err error) { _, err = w.Write(en.Marshal(nil)) return } func (en *EventResult) Marshal(dst []byte) (b []byte) { if en.Event.EstimateSize() >= cap(dst) { dst = []byte{:0:en.Event.EstimateSize()+units.Kb} } b = dst b = Marshal(b, EventLabel, func(bst []byte) (o []byte) { o = bst o = append(o, '"') o = append(o, en.Subscription...) o = append(o, '"', ',') o = en.Event.Marshal(o) return }) return } func (en *EventResult) Unmarshal(b []byte) (r []byte, err error) { r = b if en.Subscription, r, err = text.UnmarshalQuoted(r); chk.E(err) { return } en.Event = event.New() if r, err = en.Event.Unmarshal(r); err != nil { return } r, err = SkipToTheEnd(r) return }