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