diff --git a/connection.go b/connection.go index 97c649a..fe60386 100644 --- a/connection.go +++ b/connection.go @@ -3,9 +3,11 @@ package nostr import ( "context" "crypto/tls" + "errors" "fmt" "io" "net/http" + "time" ws "github.com/coder/websocket" ) @@ -51,5 +53,7 @@ func (c *Connection) Close() error { } func (c *Connection) Ping(ctx context.Context) error { + ctx, cancel := context.WithTimeoutCause(ctx, time.Millisecond*800, errors.New("ping took too long")) + defer cancel() return c.conn.Ping(ctx) } diff --git a/relay.go b/relay.go index d538381..18a27f5 100644 --- a/relay.go +++ b/relay.go @@ -186,7 +186,7 @@ func (r *Relay) ConnectWithTLS(ctx context.Context, tlsConfig *tls.Config) error select { case <-ticker.C: if r.Connection != nil { - err := r.Connection.Ping(ctx) + err := r.Connection.Ping(r.connectionContext) if err != nil { InfoLogger.Printf("{%s} error writing ping: %v; closing websocket", r.URL, err) r.Close() // this should trigger a context cancelation @@ -213,6 +213,7 @@ func (r *Relay) ConnectWithTLS(ctx context.Context, tlsConfig *tls.Config) error for { buf.Reset() + if err := conn.ReadMessage(r.connectionContext, buf); err != nil { r.ConnectionError = err r.close(err) diff --git a/sdk/sdk_test.go b/sdk/sdk_test.go index 2a6aedb..dff5196 100644 --- a/sdk/sdk_test.go +++ b/sdk/sdk_test.go @@ -55,12 +55,10 @@ func TestFollowListRecursion(t *testing.T) { results := make(chan result) go func() { for _, item := range followList.Items { - go func() { - fl := sys.FetchFollowList(ctx, item.Pubkey) - meta := sys.FetchProfileMetadata(ctx, item.Pubkey) - fmt.Println(" ~", item.Pubkey, meta.Name, len(fl.Items)) - results <- result{item.Pubkey, fl, meta} - }() + fl := sys.FetchFollowList(ctx, item.Pubkey) + meta := sys.FetchProfileMetadata(ctx, item.Pubkey) + fmt.Println(" ~", item.Pubkey, meta.Name, len(fl.Items)) + results <- result{item.Pubkey, fl, meta} } }()