diff --git a/nostr/event.go b/nostr/event.go index 7dc627e..0a5e981 100644 --- a/nostr/event.go +++ b/nostr/event.go @@ -19,6 +19,9 @@ type Event struct { Tags Tags Content string Sig string + + // anything here will be mashed together with the main event object when serializing + extra map[string]any } const ( diff --git a/nostr/event_aux.go b/nostr/event_aux.go index df3477f..2b03465 100644 --- a/nostr/event_aux.go +++ b/nostr/event_aux.go @@ -57,6 +57,9 @@ func (evt *Event) UnmarshalJSON(payload []byte) error { return fmt.Errorf("event is not an object") } + // prepare this to receive any extra property that may serialized along with the event + evt.extra = make(map[string]any) + var visiterr error obj.Visit(func(k []byte, v *fastjson.Value) { key := string(k) @@ -102,6 +105,10 @@ func (evt *Event) UnmarshalJSON(payload []byte) error { visiterr = fmt.Errorf("invalid 'sig' field: %w", err) } evt.Sig = string(id) + default: + var anyValue any + json.Unmarshal(v.MarshalTo(nil), anyValue) + evt.extra[key] = anyValue } }) if visiterr != nil { @@ -123,6 +130,13 @@ func (evt Event) MarshalJSON() ([]byte, error) { o.Set("content", arena.NewString(evt.Content)) o.Set("sig", arena.NewString(evt.Sig)) + for k, v := range evt.extra { + b, _ := json.Marshal(v) + if val, err := fastjson.ParseBytes(b); err == nil { + o.Set(k, val) + } + } + return o.MarshalTo(nil), nil }