nip46: ParseBunkerInput() for allowing NewBunker() to be used without calling "connect".

This commit is contained in:
fiatjaf
2025-07-19 11:52:09 -03:00
parent 68b0caf2ab
commit e164b49aad

View File

@@ -44,43 +44,66 @@ func ConnectBunker(
pool *nostr.Pool, pool *nostr.Pool,
onAuth func(string), onAuth func(string),
) (*BunkerClient, error) { ) (*BunkerClient, error) {
parsed, err := url.Parse(bunkerURLOrNIP05) parsed, err := ParseBunkerInput(ctx, bunkerURLOrNIP05)
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid url: %w", err) return nil, fmt.Errorf("invalid bunker: %w", err)
}
// assume it's a bunker url (will fail later if not)
secret := parsed.Query().Get("secret")
relays := parsed.Query()["relay"]
targetPublicKey, _ := nostr.PubKeyFromHex(parsed.Host)
if parsed.Scheme == "" {
// could be a NIP-05
pubkey, relays_, err := queryWellKnownNostrJson(ctx, bunkerURLOrNIP05)
if err != nil {
return nil, fmt.Errorf("failed to query nip05: %w", err)
}
targetPublicKey = pubkey
relays = relays_
} else if parsed.Scheme == "bunker" {
// this is what we were expecting, so just move on
} else {
// otherwise fail here
return nil, fmt.Errorf("wrong scheme '%s', must be bunker://", parsed.Scheme)
} }
bunker := NewBunker( bunker := NewBunker(
ctx, ctx,
clientSecretKey, clientSecretKey,
targetPublicKey, parsed.HostPubKey,
relays, parsed.Relays,
pool, pool,
onAuth, onAuth,
) )
_, err = bunker.RPC(ctx, "connect", []string{hex.EncodeToString(targetPublicKey[:]), secret}) _, err = bunker.RPC(ctx, "connect", []string{hex.EncodeToString(parsed.HostPubKey[:]), parsed.Secret})
return bunker, err return bunker, err
} }
type ParsedBunker struct {
HostPubKey nostr.PubKey
Relays []string
Secret string
}
func ParseBunkerInput(ctx context.Context, bunkerURLOrNIP05 string) (ParsedBunker, error) {
parsed, err := url.Parse(bunkerURLOrNIP05)
if err != nil {
return ParsedBunker{}, fmt.Errorf("invalid url: %w", err)
}
var host nostr.PubKey
var secret string
var relays []string
if parsed.Scheme == "" {
// could be a NIP-05
pubkey, relays_, err := queryWellKnownNostrJson(ctx, bunkerURLOrNIP05)
if err != nil {
return ParsedBunker{}, fmt.Errorf("failed to query nip05: %w", err)
}
host = pubkey
relays = relays_
} else if parsed.Scheme == "bunker" {
secret = parsed.Query().Get("secret")
relays = parsed.Query()["relay"]
host, err = nostr.PubKeyFromHex(parsed.Host)
if err != nil {
return ParsedBunker{}, fmt.Errorf("invalid host pubkey: %w", err)
}
} else {
// otherwise fail here
return ParsedBunker{}, fmt.Errorf("wrong scheme '%s', must be bunker://", parsed.Scheme)
}
return ParsedBunker{
HostPubKey: host,
Relays: relays,
Secret: secret,
}, nil
}
func NewBunker( func NewBunker(
ctx context.Context, ctx context.Context,
clientSecretKey [32]byte, clientSecretKey [32]byte,