nip46: do not allow one faulty relay to break RPC calls to other relays.

This commit is contained in:
fiatjaf 2024-08-29 17:49:51 -03:00
parent 1db4da7ed3
commit 5edb54efee

View File

@ -205,17 +205,25 @@ func (bunker *BunkerClient) RPC(ctx context.Context, method string, params []str
respWaiter := make(chan Response)
bunker.listeners.Store(id, respWaiter)
hasWorked := false
hasWorked := make(chan struct{})
for _, r := range bunker.relays {
relay, err := bunker.pool.EnsureRelay(r)
if err == nil {
hasWorked = true
}
relay.Publish(ctx, evt)
for _, url := range bunker.relays {
go func(url string) {
relay, err := bunker.pool.EnsureRelay(url)
if err == nil {
select {
case hasWorked <- struct{}{}:
default:
}
}
relay.Publish(ctx, evt)
}(url)
}
if !hasWorked {
select {
case <-hasWorked:
// continue
case <-ctx.Done():
return "", fmt.Errorf("couldn't connect to any relay")
}