From b4481918feeb988221cbb43b18af2a398c7c0c5e Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sun, 7 Feb 2021 07:56:55 -0300 Subject: [PATCH] many fixes and some logs. --- event/event.go | 12 ++++--- relaypool/relaypool.go | 79 ++++++++++++++++++++++++------------------ 2 files changed, 53 insertions(+), 38 deletions(-) diff --git a/event/event.go b/event/event.go index 28dc62c..4fdd053 100644 --- a/event/event.go +++ b/event/event.go @@ -13,10 +13,11 @@ import ( ) const ( - KindSetMetadata uint8 = 0 - KindTextNote uint8 = 1 - KindRecommendServer uint8 = 2 - KindContactList uint8 = 3 + KindSetMetadata uint8 = 0 + KindTextNote uint8 = 1 + KindRecommendServer uint8 = 2 + KindContactList uint8 = 3 + KindEncryptedDirectMessage uint8 = 4 ) type Event struct { @@ -130,7 +131,7 @@ func (evt Event) CheckSignature() (bool, error) { } // Sign signs an event with a given privateKey -func (evt Event) Sign(privateKey string) error { +func (evt *Event) Sign(privateKey string) error { h := sha256.Sum256(evt.Serialize()) s, _ := new(big.Int).SetString(privateKey, 16) @@ -145,6 +146,7 @@ func (evt Event) Sign(privateKey string) error { return err } + evt.ID = hex.EncodeToString(h[:]) evt.Sig = hex.EncodeToString(sig[:]) return nil } diff --git a/relaypool/relaypool.go b/relaypool/relaypool.go index 9c5bee8..0f1afe8 100644 --- a/relaypool/relaypool.go +++ b/relaypool/relaypool.go @@ -3,6 +3,7 @@ package relaypool import ( "encoding/json" "errors" + "fmt" "log" "github.com/fiatjaf/go-nostr/event" @@ -41,13 +42,13 @@ type EventMessage struct { func (em *EventMessage) UnmarshalJSON(b []byte) error { var temp []json.RawMessage - if err := json.Unmarshal(b, temp); err != nil { + if err := json.Unmarshal(b, &temp); err != nil { return err } if len(temp) < 2 { return errors.New("message is not an array of 2 or more") } - if err := json.Unmarshal(temp[0], em.Event); err != nil { + if err := json.Unmarshal(temp[0], &em.Event); err != nil { return err } var context string @@ -65,7 +66,7 @@ type NoticeMessage struct { func (nm *NoticeMessage) UnmarshalJSON(b []byte) error { var temp []json.RawMessage - if err := json.Unmarshal(b, temp); err != nil { + if err := json.Unmarshal(b, &temp); err != nil { return err } if len(temp) < 2 { @@ -98,29 +99,25 @@ func New() *RelayPool { // Add adds a new relay to the pool, if policy is nil, it will be a simple // read+write policy. -func (r *RelayPool) Add(url string, policy *Policy) { +func (r *RelayPool) Add(url string, policy *Policy) error { if policy == nil { policy = &Policy{SimplePolicy: SimplePolicy{Read: true, Write: true}} } nm := nostrutils.NormalizeURL(url) if nm == "" { - return + return fmt.Errorf("invalid relay URL '%s'", url) + } + + conn, _, err := websocket.DefaultDialer.Dial(nostrutils.WebsocketURL(url), nil) + if err != nil { + return fmt.Errorf("error opening websocket to '%s': %w", nm, err) } r.Relays[nm] = *policy - conn, _, err := websocket.DefaultDialer.Dial(nostrutils.WebsocketURL(url), nil) - if err != nil { - return - } - - defer r.Remove(nm) - done := make(chan struct{}) - r.websockets[nm] = conn go func() { - defer close(done) for { typ, message, err := conn.ReadMessage() if err != nil { @@ -135,23 +132,25 @@ func (r *RelayPool) Add(url string, policy *Policy) { continue } - var noticeMessage *NoticeMessage - var eventMessage *EventMessage - err = json.Unmarshal(message, eventMessage) + var noticeMessage NoticeMessage + var eventMessage EventMessage + err = json.Unmarshal(message, &eventMessage) if err == nil { eventMessage.Relay = nm - r.Events <- eventMessage + r.Events <- &eventMessage } else { - err = json.Unmarshal(message, noticeMessage) + err = json.Unmarshal(message, ¬iceMessage) if err == nil { noticeMessage.Relay = nm - r.Notices <- noticeMessage + r.Notices <- ¬iceMessage } else { continue } } } }() + + return nil } // Remove removes a relay from the pool. @@ -191,8 +190,11 @@ func (r *RelayPool) ReqFeed(opts map[string]interface{}) { sopts = string(jopts) } - for _, conn := range r.websockets { - conn.WriteMessage(websocket.TextMessage, []byte("req-feed:"+sopts)) + for r, conn := range r.websockets { + err := conn.WriteMessage(websocket.TextMessage, []byte("req-feed:"+sopts)) + if err != nil { + log.Printf("error sending req-feed to '%s': %s", r, err.Error()) + } } } @@ -205,8 +207,11 @@ func (r *RelayPool) ReqEvent(id string, opts map[string]interface{}) { jopts, _ := json.Marshal(opts) sopts := string(jopts) - for _, conn := range r.websockets { - conn.WriteMessage(websocket.TextMessage, []byte("req-event:"+sopts)) + for r, conn := range r.websockets { + err := conn.WriteMessage(websocket.TextMessage, []byte("req-event:"+sopts)) + if err != nil { + log.Printf("error sending req-event to '%s': %s", r, err.Error()) + } } } @@ -219,25 +224,33 @@ func (r *RelayPool) ReqKey(key string, opts map[string]interface{}) { jopts, _ := json.Marshal(opts) sopts := string(jopts) - for _, conn := range r.websockets { - conn.WriteMessage(websocket.TextMessage, []byte("req-key:"+sopts)) + for r, conn := range r.websockets { + err := conn.WriteMessage(websocket.TextMessage, []byte("req-key:"+sopts)) + if err != nil { + log.Printf("error sending req-key to '%s': %s", r, err.Error()) + } } } -func (r *RelayPool) PublishEvent(evt *event.Event) error { +func (r *RelayPool) PublishEvent(evt *event.Event) (*event.Event, error) { if r.SecretKey == nil && evt.Sig == "" { - return errors.New("PublishEvent needs either a signed event to publish or to have been configured with a .SecretKey.") + return nil, errors.New("PublishEvent needs either a signed event to publish or to have been configured with a .SecretKey.") } if evt.Sig == "" { - evt.Sign(*r.SecretKey) + err := evt.Sign(*r.SecretKey) + if err != nil { + return nil, fmt.Errorf("Error signing event: %w", err) + } } jevt, _ := json.Marshal(evt) - - for _, conn := range r.websockets { - conn.WriteMessage(websocket.TextMessage, jevt) + for r, conn := range r.websockets { + err := conn.WriteMessage(websocket.TextMessage, jevt) + if err != nil { + log.Printf("error sending event to '%s': %s", r, err.Error()) + } } - return nil + return evt, nil }