many fixes and some logs.
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, ¬iceMessage)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
noticeMessage.Relay = nm
|
noticeMessage.Relay = nm
|
||||||
r.Notices <- noticeMessage
|
r.Notices <- ¬iceMessage
|
||||||
} 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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user