From 2353cce83234e58f617eabba5b8de1b4fc6587dc Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Wed, 22 Jan 2025 09:46:48 -0800 Subject: [PATCH] Move parseBunkerUrl to static method, add getBunkerUrl --- packages/app/src/router.ts | 6 ++- packages/feeds/src/core.ts | 1 + packages/signer/src/signers/nip46.ts | 59 +++++++++++++++++++--------- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/packages/app/src/router.ts b/packages/app/src/router.ts index 1eb7410..d867104 100644 --- a/packages/app/src/router.ts +++ b/packages/app/src/router.ts @@ -179,7 +179,11 @@ export class Router { Quote = (event: TrustedEvent, value: string, relays: string[] = []) => { const tag = event.tags.find(t => t[1] === value) - const scenarios = [this.ForPubkey(event.pubkey), this.FromPubkey(event.pubkey)] + const scenarios = [ + this.FromRelays(relays), + this.ForPubkey(event.pubkey), + this.FromPubkey(event.pubkey), + ] if (tag?.[2] && isShareableRelayUrl(tag[2])) { scenarios.push(this.FromRelays([tag[2]])) diff --git a/packages/feeds/src/core.ts b/packages/feeds/src/core.ts index 5c20042..3699827 100644 --- a/packages/feeds/src/core.ts +++ b/packages/feeds/src/core.ts @@ -132,4 +132,5 @@ export type FeedOptions = { onEvent?: (event: TrustedEvent) => void onExhausted?: () => void useWindowing?: boolean + abortController?: AbortController } diff --git a/packages/signer/src/signers/nip46.ts b/packages/signer/src/signers/nip46.ts index 21a948f..66ab5da 100644 --- a/packages/signer/src/signers/nip46.ts +++ b/packages/signer/src/signers/nip46.ts @@ -29,6 +29,7 @@ export enum Nip46Event { export type Nip46BrokerParams = { relays: string[] clientSecret: string + connectSecret?: string signerPubkey?: string algorithm?: Nip46Algorithm } @@ -261,6 +262,26 @@ export class Nip46Broker extends Emitter { return singleton } + // Static utility methods + + static parseBunkerUrl = (url: string) => { + let connectSecret = "" + let signerPubkey = "" + let relays: string[] = [] + + try { + const _url = new URL(url) + + relays = _url.searchParams.getAll("relay") || [] + signerPubkey = _url.hostname || _url.pathname.replace(/\//g, "") + connectSecret = _url.searchParams.get("secret") || "" + } catch { + // pass + } + + return {signerPubkey, connectSecret, relays: relays.map(normalizeRelayUrl)} + } + // Expose params without exposing params hasParams(params: Nip46BrokerParams) { @@ -329,24 +350,6 @@ export class Nip46Broker extends Emitter { // Methods for initiating a connection - parseBunkerUrl = (url: string) => { - let connectSecret = "" - let signerPubkey = "" - let relays: string[] = [] - - try { - const _url = new URL(url) - - relays = _url.searchParams.getAll("relay") || [] - signerPubkey = _url.hostname || _url.pathname.replace(/\//g, "") - connectSecret = _url.searchParams.get("secret") || "" - } catch { - // pass - } - - return {signerPubkey, connectSecret, relays: relays.map(normalizeRelayUrl)} - } - makeNostrconnectUrl = async (meta: Record = {}) => { const clientPubkey = await this.signer.getPubkey() const secret = Math.random().toString(36).substring(7) @@ -395,6 +398,26 @@ export class Nip46Broker extends Emitter { }) } + // Methods for serializing a connection + + getBunkerUrl = () => { + if (!this.params.signerPubkey) { + throw new Error("Attempted to get a bunker url with no signerPubkey") + } + + const params = new URLSearchParams() + + for (const relay of this.params.relays) { + params.append("relay", relay) + } + + if (this.params.connectSecret) { + params.set("secret", this.params.connectSecret) + } + + return "bunker://" + this.params.signerPubkey + "?" + params.toString() + } + // Normal NIP 46 methods ping = () => this.send("ping", [])