From bc9497b0312777a0d044cad4bc4d597b106f0360 Mon Sep 17 00:00:00 2001 From: Michael Bumann Date: Mon, 27 Mar 2023 21:47:04 +0200 Subject: [PATCH] Parse wallet connect URLs --- src/webln/NostrWeblnProvider.ts | 38 +++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/webln/NostrWeblnProvider.ts b/src/webln/NostrWeblnProvider.ts index 1a7b1d7..41199c9 100644 --- a/src/webln/NostrWeblnProvider.ts +++ b/src/webln/NostrWeblnProvider.ts @@ -26,6 +26,13 @@ declare global { var nostr: Nostr | undefined; } +interface NostrWebLNOptions { + relayUrl: string; + walletPubkey: string; + privateKey?: string; +} + + export class NostrWebLNProvider { relay: Relay; relayUrl: string; @@ -34,14 +41,33 @@ export class NostrWebLNProvider { subscribers: Record void>; connected: boolean; - constructor(options: { relayUrl: string, privateKey?: string, walletPubkey: string }) { - options = { ...DEFAULT_OPTIONS, ...options }; - this.relayUrl = options.relayUrl; + static parseWalletConnectUrl(walletConnectUrl: string) { + const url = new URL(walletConnectUrl); + const options = {} as NostrWebLNOptions; + options.walletPubkey = url.pathname.replace('//', ''); + const privateKey = url.searchParams.get('secret'); + const relayUrl = url.searchParams.get('relay'); + if (privateKey) { + options.privateKey = privateKey; + } + if (relayUrl) { + options.relayUrl = relayUrl; + } + return options; + } + constructor(options: { relayUrl?: string, privateKey?: string, walletPubkey?: string, nostrWalletConnectUrl?: string }) { + if (options.nostrWalletConnectUrl) { + options = { + ...NostrWebLNProvider.parseWalletConnectUrl(options.nostrWalletConnectUrl), ...options + }; + } + const _options = { ...DEFAULT_OPTIONS, ...options } as NostrWebLNOptions; + this.relayUrl = _options.relayUrl; this.relay = relayInit(this.relayUrl); - if (options.privateKey) { - this.privateKey = (options.privateKey.toLowerCase().startsWith('nsec') ? nip19.decode(options.privateKey).data : options.privateKey) as string; + if (_options.privateKey) { + this.privateKey = (_options.privateKey.toLowerCase().startsWith('nsec') ? nip19.decode(_options.privateKey).data : _options.privateKey) as string; } - this.walletPubkey = (options.walletPubkey.toLowerCase().startsWith('npub') ? nip19.decode(options.walletPubkey).data : options.walletPubkey) as string; + this.walletPubkey = (_options.walletPubkey.toLowerCase().startsWith('npub') ? nip19.decode(_options.walletPubkey).data : _options.walletPubkey) as string; this.subscribers = {}; this.connected = false; }