diff --git a/envelopes.go b/envelopes.go index aa7675a..52b3463 100644 --- a/envelopes.go +++ b/envelopes.go @@ -268,7 +268,7 @@ func (v CloseEnvelope) MarshalJSON() ([]byte, error) { type OKEnvelope struct { EventID string OK bool - Reason *string + Reason string } func (_ OKEnvelope) Label() string { return "OK" } @@ -276,15 +276,12 @@ func (_ OKEnvelope) Label() string { return "OK" } func (v *OKEnvelope) UnmarshalJSON(data []byte) error { r := gjson.ParseBytes(data) arr := r.Array() - if len(arr) < 3 { + if len(arr) < 4 { return fmt.Errorf("failed to decode OK envelope: missing fields") } v.EventID = arr[1].Str v.OK = arr[2].Raw == "true" - - if len(arr) > 3 { - v.Reason = &arr[3].Str - } + v.Reason = arr[3].Str return nil } @@ -298,10 +295,8 @@ func (v OKEnvelope) MarshalJSON() ([]byte, error) { ok = "true" } w.RawString(ok) - if v.Reason != nil { - w.RawString(`,`) - w.Raw(json.Marshal(v.Reason)) - } + w.RawString(`,`) + w.Raw(json.Marshal(v.Reason)) w.RawString(`]`) return w.BuildBytes() } diff --git a/relay.go b/relay.go index 6f383ad..11aabc4 100644 --- a/relay.go +++ b/relay.go @@ -51,7 +51,7 @@ type Relay struct { challenges chan string // NIP-42 challenges notices chan string // NIP-01 NOTICEs - okCallbacks *xsync.MapOf[string, func(bool, *string)] + okCallbacks *xsync.MapOf[string, func(bool, string)] writeQueue chan writeRequest subscriptionChannelCloseQueue chan *Subscription @@ -73,7 +73,7 @@ func NewRelay(ctx context.Context, url string, opts ...RelayOption) *Relay { connectionContext: ctx, connectionContextCancel: cancel, Subscriptions: xsync.NewMapOf[*Subscription](), - okCallbacks: xsync.NewMapOf[func(bool, *string)](), + okCallbacks: xsync.NewMapOf[func(bool, string)](), writeQueue: make(chan writeRequest), subscriptionChannelCloseQueue: make(chan *Subscription), } @@ -346,22 +346,17 @@ func (r *Relay) Publish(ctx context.Context, event Event) (Status, error) { defer cancel() // listen for an OK callback - okCallback := func(ok bool, msg *string) { + r.okCallbacks.Store(event.ID, func(ok bool, reason string) { mu.Lock() defer mu.Unlock() if ok { status = PublishStatusSucceeded } else { status = PublishStatusFailed - reason := "" - if msg != nil { - reason = *msg - } err = fmt.Errorf("msg: %s", reason) } cancel() - } - r.okCallbacks.Store(event.ID, okCallback) + }) defer r.okCallbacks.Delete(event.ID) // publish event @@ -410,22 +405,17 @@ func (r *Relay) Auth(ctx context.Context, event Event) (Status, error) { defer cancel() // listen for an OK callback - okCallback := func(ok bool, msg *string) { + r.okCallbacks.Store(event.ID, func(ok bool, reason string) { mu.Lock() if ok { status = PublishStatusSucceeded } else { status = PublishStatusFailed - reason := "" - if msg != nil { - reason = *msg - } err = fmt.Errorf("msg: %s", reason) } mu.Unlock() cancel() - } - r.okCallbacks.Store(event.ID, okCallback) + }) defer r.okCallbacks.Delete(event.ID) // send AUTH