From 4712566d20f413052187160d650647fa69fc1d1f Mon Sep 17 00:00:00 2001 From: nate Date: Sun, 16 Jun 2024 22:23:42 -0400 Subject: [PATCH] login stuff --- src/lib/stores/nostr.ts | 7 +++ src/lib/utils/login.ts | 105 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 src/lib/utils/login.ts diff --git a/src/lib/stores/nostr.ts b/src/lib/stores/nostr.ts index 573da9b..af4fdcf 100644 --- a/src/lib/stores/nostr.ts +++ b/src/lib/stores/nostr.ts @@ -1,5 +1,6 @@ import { writable } from 'svelte/store'; import NDKSvelte from '@nostr-dev-kit/ndk-svelte'; +import NDK from '@nostr-dev-kit/ndk'; let relays; @@ -34,3 +35,9 @@ console.log(_ndk.activeUser?.profile); const ndkStore = writable(_ndk); export const ndk = ndkStore; + +const _bunkerNDK = new NDK({ + explicitRelayUrls: [...defaultRelays, 'wss://relay.nsecbunker.com', 'wss://nostr.vulpem.com'] +}); + +export const bunkerNDK = writable(_bunkerNDK); diff --git a/src/lib/utils/login.ts b/src/lib/utils/login.ts new file mode 100644 index 0000000..e622b4f --- /dev/null +++ b/src/lib/utils/login.ts @@ -0,0 +1,105 @@ +import type NDK from '@nostr-dev-kit/ndk'; +import { NDKNip07Signer, NDKNip46Signer, NDKPrivateKeySigner, NDKUser } from '@nostr-dev-kit/ndk'; + +export type LoginMethod = 'none' | 'pk' | 'nip07' | 'nip46'; + +export async function login( + ndk: NDK, + bunkerNDK?: NDK, + method?: LoginMethod +): Promise { + const nostrKeyMethod = method || localStorage.getItem('nostr-key-method'); + + switch (nostrKeyMethod) { + case 'none': + return null; + case 'pk': + const key = localStorage.getItem('nostr-key'); + if (!key) return null; + + const signer = new NDKPrivateKeySigner(key); + ndk.signer = signer; + const user = await signer.user(); + if (user) user.ndk = ndk; + return user; + case 'nip07': + return nip07SignIn(ndk); + case 'nip46': + const promise = new Promise((resolve, reject) => { + const existingPrivateKey = localStorage.getItem('nostr-nsecbunker-key'); + + if (!bunkerNDK) bunkerNDK = ndk; + + if (existingPrivateKey) { + bunkerNDK.connect(2500); + bunkerNDK.pool.on('relay:connect', async () => { + const user = await nip46SignIn(ndk, bunkerNDK!, existingPrivateKey); + resolve(user); + }); + } + }); + default: { + const promise = new Promise((resolve, reject) => { + let loadAttempts = 0; + const loadNip07Interval = setInterval(() => { + if (window.nostr) { + clearInterval(loadNip07Interval); + const user = nip07SignIn(ndk); + resolve(user); + } + if (loadAttempts++ > 10) clearInterval(loadNip07Interval); + }, 100); + }); + return promise; + } + } +} + +async function nip07SignIn(ndk: NDK): Promise { + const storedNpub = localStorage.getItem('currentUserNpub'); + let user: NDKUser | null = null; + + if (storedNpub) { + user = new NDKUser({ npub: storedNpub }); + user.ndk = ndk; + } + + if (window.nostr) { + try { + ndk.signer = new NDKNip07Signer(); + user = await ndk.signer.user(); + user.ndk = ndk; + localStorage.setItem('currentUserNpub', user.npub); + ndk = ndk; + } catch (e) {} + } + + return user; +} + +async function nip46SignIn( + ndk: NDK, + bunkerNDK: NDK, + existingPrivateKey: string +): Promise { + const npub = localStorage.getItem('nostr-target-npub')!; + const remoteUser = new NDKUser({ npub }); + let user: NDKUser | null = null; + remoteUser.ndk = bunkerNDK; + + // check if there is a private key stored in localStorage + let localSigner: NDKPrivateKeySigner | undefined = undefined; + + if (existingPrivateKey) { + localSigner = new NDKPrivateKeySigner(existingPrivateKey); + } + + const remoteSigner = new NDKNip46Signer(bunkerNDK, remoteUser.pubkey, localSigner); + + await remoteSigner.blockUntilReady(); + ndk.signer = remoteSigner; + user = remoteUser; + user.ndk = ndk; + + return user; +}