nip46: ParseBunkerInput() for allowing NewBunker() to be used without calling "connect".
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user