many fixes and some logs.

This commit is contained in:
fiatjaf
2021-02-07 07:56:55 -03:00
parent 32c21eb652
commit b4481918fe
2 changed files with 53 additions and 38 deletions

View File

@@ -13,10 +13,11 @@ import (
) )
const ( const (
KindSetMetadata uint8 = 0 KindSetMetadata uint8 = 0
KindTextNote uint8 = 1 KindTextNote uint8 = 1
KindRecommendServer uint8 = 2 KindRecommendServer uint8 = 2
KindContactList uint8 = 3 KindContactList uint8 = 3
KindEncryptedDirectMessage uint8 = 4
) )
type Event struct { type Event struct {
@@ -130,7 +131,7 @@ func (evt Event) CheckSignature() (bool, error) {
} }
// Sign signs an event with a given privateKey // 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()) h := sha256.Sum256(evt.Serialize())
s, _ := new(big.Int).SetString(privateKey, 16) s, _ := new(big.Int).SetString(privateKey, 16)
@@ -145,6 +146,7 @@ func (evt Event) Sign(privateKey string) error {
return err return err
} }
evt.ID = hex.EncodeToString(h[:])
evt.Sig = hex.EncodeToString(sig[:]) evt.Sig = hex.EncodeToString(sig[:])
return nil return nil
} }

View File

@@ -3,6 +3,7 @@ package relaypool
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"log" "log"
"github.com/fiatjaf/go-nostr/event" "github.com/fiatjaf/go-nostr/event"
@@ -41,13 +42,13 @@ type EventMessage struct {
func (em *EventMessage) UnmarshalJSON(b []byte) error { func (em *EventMessage) UnmarshalJSON(b []byte) error {
var temp []json.RawMessage var temp []json.RawMessage
if err := json.Unmarshal(b, temp); err != nil { if err := json.Unmarshal(b, &temp); err != nil {
return err return err
} }
if len(temp) < 2 { if len(temp) < 2 {
return errors.New("message is not an array of 2 or more") 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 return err
} }
var context string var context string
@@ -65,7 +66,7 @@ type NoticeMessage struct {
func (nm *NoticeMessage) UnmarshalJSON(b []byte) error { func (nm *NoticeMessage) UnmarshalJSON(b []byte) error {
var temp []json.RawMessage var temp []json.RawMessage
if err := json.Unmarshal(b, temp); err != nil { if err := json.Unmarshal(b, &temp); err != nil {
return err return err
} }
if len(temp) < 2 { 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 // Add adds a new relay to the pool, if policy is nil, it will be a simple
// read+write policy. // read+write policy.
func (r *RelayPool) Add(url string, policy *Policy) { func (r *RelayPool) Add(url string, policy *Policy) error {
if policy == nil { if policy == nil {
policy = &Policy{SimplePolicy: SimplePolicy{Read: true, Write: true}} policy = &Policy{SimplePolicy: SimplePolicy{Read: true, Write: true}}
} }
nm := nostrutils.NormalizeURL(url) nm := nostrutils.NormalizeURL(url)
if nm == "" { 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 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 r.websockets[nm] = conn
go func() { go func() {
defer close(done)
for { for {
typ, message, err := conn.ReadMessage() typ, message, err := conn.ReadMessage()
if err != nil { if err != nil {
@@ -135,23 +132,25 @@ func (r *RelayPool) Add(url string, policy *Policy) {
continue continue
} }
var noticeMessage *NoticeMessage var noticeMessage NoticeMessage
var eventMessage *EventMessage var eventMessage EventMessage
err = json.Unmarshal(message, eventMessage) err = json.Unmarshal(message, &eventMessage)
if err == nil { if err == nil {
eventMessage.Relay = nm eventMessage.Relay = nm
r.Events <- eventMessage r.Events <- &eventMessage
} else { } else {
err = json.Unmarshal(message, noticeMessage) err = json.Unmarshal(message, &noticeMessage)
if err == nil { if err == nil {
noticeMessage.Relay = nm noticeMessage.Relay = nm
r.Notices <- noticeMessage r.Notices <- &noticeMessage
} else { } else {
continue continue
} }
} }
} }
}() }()
return nil
} }
// Remove removes a relay from the pool. // Remove removes a relay from the pool.
@@ -191,8 +190,11 @@ func (r *RelayPool) ReqFeed(opts map[string]interface{}) {
sopts = string(jopts) sopts = string(jopts)
} }
for _, conn := range r.websockets { for r, conn := range r.websockets {
conn.WriteMessage(websocket.TextMessage, []byte("req-feed:"+sopts)) 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) jopts, _ := json.Marshal(opts)
sopts := string(jopts) sopts := string(jopts)
for _, conn := range r.websockets { for r, conn := range r.websockets {
conn.WriteMessage(websocket.TextMessage, []byte("req-event:"+sopts)) 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) jopts, _ := json.Marshal(opts)
sopts := string(jopts) sopts := string(jopts)
for _, conn := range r.websockets { for r, conn := range r.websockets {
conn.WriteMessage(websocket.TextMessage, []byte("req-key:"+sopts)) 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 == "" { 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 == "" { 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) jevt, _ := json.Marshal(evt)
for r, conn := range r.websockets {
for _, conn := range r.websockets { err := conn.WriteMessage(websocket.TextMessage, jevt)
conn.WriteMessage(websocket.TextMessage, jevt) if err != nil {
log.Printf("error sending event to '%s': %s", r, err.Error())
}
} }
return nil return evt, nil
} }