Speed up initial login

This commit is contained in:
Jon Staab
2024-12-03 16:18:36 -08:00
parent 1ea39c1d56
commit efb0528f76
5 changed files with 38 additions and 31 deletions
+12 -7
View File
@@ -140,6 +140,8 @@ export const loginWithNip46 = async ({
if (!pubkey) return false if (!pubkey) return false
await loadUserData(pubkey)
const handler = {relays, pubkey: signerPubkey} const handler = {relays, pubkey: signerPubkey}
addSession({method: "nip46", pubkey, secret: clientSecret, handler}) addSession({method: "nip46", pubkey, secret: clientSecret, handler})
@@ -153,13 +155,16 @@ export const loadUserData = (
pubkey: string, pubkey: string,
request: Partial<SubscribeRequestWithHandlers> = {}, request: Partial<SubscribeRequestWithHandlers> = {},
) => { ) => {
const promise = Promise.all([ const promise = Promise.race([
loadInboxRelaySelections(pubkey, request), sleep(3000),
loadMembership(pubkey, request), Promise.all([
loadSettings(pubkey, request), loadInboxRelaySelections(pubkey, request),
loadProfile(pubkey, request), loadMembership(pubkey, request),
loadFollows(pubkey, request), loadSettings(pubkey, request),
loadMutes(pubkey, request), loadProfile(pubkey, request),
loadFollows(pubkey, request),
loadMutes(pubkey, request),
]),
]) ])
// Load followed profiles slowly in the background without clogging other stuff up // Load followed profiles slowly in the background without clogging other stuff up
+11 -12
View File
@@ -20,28 +20,27 @@
const signUp = () => pushModal(SignUp) const signUp = () => pushModal(SignUp)
const withLoading = const withLoading =
(cb: (...args: any[]) => any) => (s: string, cb: (...args: any[]) => any) =>
async (...args: any[]) => { async (...args: any[]) => {
loading = true loading = s
try { try {
await cb(...args) await cb(...args)
} finally { } finally {
loading = false loading = undefined
} }
} }
const onSuccess = async (session: Session, relays: string[] = []) => { const onSuccess = async (session: Session, relays: string[] = []) => {
addSession(session)
await loadUserData(session.pubkey, {relays}) await loadUserData(session.pubkey, {relays})
addSession(session)
pushToast({message: "Successfully logged in!"}) pushToast({message: "Successfully logged in!"})
setChecked("*") setChecked("*")
clearModals() clearModals()
} }
const loginWithNip07 = withLoading(async () => { const loginWithNip07 = withLoading("nip07", async () => {
const pubkey = await getNip07()?.getPublicKey() const pubkey = await getNip07()?.getPublicKey()
if (pubkey) { if (pubkey) {
@@ -54,7 +53,7 @@
} }
}) })
const loginWithSigner = withLoading(async (app: any) => { const loginWithNip55 = withLoading("nip55", async (app: any) => {
const signer = new Nip55Signer(app.packageName) const signer = new Nip55Signer(app.packageName)
const pubkey = await signer.getPubkey() const pubkey = await signer.getPubkey()
@@ -72,8 +71,8 @@
const loginWithBunker = () => pushModal(LogInBunker) const loginWithBunker = () => pushModal(LogInBunker)
let loading = false
let signers: any[] = [] let signers: any[] = []
let loading: string | undefined
let hasNativeSigner = Boolean(getNip07()) let hasNativeSigner = Boolean(getNip07())
onMount(async () => { onMount(async () => {
@@ -96,7 +95,7 @@
</p> </p>
{#if BURROW_URL} {#if BURROW_URL}
<Button disabled={loading} on:click={loginWithPassword} class="btn btn-primary"> <Button disabled={loading} on:click={loginWithPassword} class="btn btn-primary">
{#if loading} {#if loading === "password"}
<span class="loading loading-spinner mr-3" /> <span class="loading loading-spinner mr-3" />
{:else} {:else}
<Icon icon="key" /> <Icon icon="key" />
@@ -109,7 +108,7 @@
disabled={loading} disabled={loading}
on:click={loginWithNip07} on:click={loginWithNip07}
class={cx("btn", {"btn-primary": !BURROW_URL, "btn-neutral": BURROW_URL})}> class={cx("btn", {"btn-primary": !BURROW_URL, "btn-neutral": BURROW_URL})}>
{#if loading} {#if loading === "nip07"}
<span class="loading loading-spinner mr-3" /> <span class="loading loading-spinner mr-3" />
{:else} {:else}
<Icon icon="widget" /> <Icon icon="widget" />
@@ -121,8 +120,8 @@
<Button <Button
disabled={loading} disabled={loading}
class={cx("btn", {"btn-primary": !BURROW_URL, "btn-neutral": BURROW_URL})} class={cx("btn", {"btn-primary": !BURROW_URL, "btn-neutral": BURROW_URL})}
on:click={() => loginWithSigner(app)}> on:click={() => loginWithNip55(app)}>
{#if loading} {#if loading === "nip55"}
<span class="loading loading-spinner mr-3" /> <span class="loading loading-spinner mr-3" />
{:else} {:else}
<img src={app.iconUrl} alt={app.name} width="20" height="20" /> <img src={app.iconUrl} alt={app.name} width="20" height="20" />
+6 -6
View File
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import {onMount, onDestroy} from "svelte" import {onMount, onDestroy} from "svelte"
import {Nip46Broker, makeSecret} from "@welshman/signer" import {Nip46Broker, makeSecret} from "@welshman/signer"
import {addSession, pubkey} from "@welshman/app" import {addSession} from "@welshman/app"
import {slideAndFade} from "@lib/transition" import {slideAndFade} from "@lib/transition"
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
@@ -42,10 +42,10 @@
loading = true loading = true
try { try {
if (await loginWithNip46({connectSecret, clientSecret, signerPubkey, relays})) { const success = await loginWithNip46({connectSecret, clientSecret, signerPubkey, relays})
abortController.abort()
await loadUserData($pubkey!) if (success) {
abortController.abort()
} else { } else {
return pushToast({ return pushToast({
theme: "error", theme: "error",
@@ -90,6 +90,8 @@
const userPubkey = await broker.getPublicKey() const userPubkey = await broker.getPublicKey()
await loadUserData(userPubkey)
addSession({ addSession({
method: "nip46", method: "nip46",
pubkey: userPubkey, pubkey: userPubkey,
@@ -100,8 +102,6 @@
}, },
}) })
await loadUserData(userPubkey)
setChecked("*") setChecked("*")
clearModals() clearModals()
} }
+6 -3
View File
@@ -25,7 +25,9 @@
const abortController = new AbortController() const abortController = new AbortController()
const relays = [normalizeRelayUrl("ws://" + stripProtocol(BURROW_URL))] const relays = BURROW_URL.startsWith('http://')
? [normalizeRelayUrl("ws://" + stripProtocol(BURROW_URL))]
: [normalizeRelayUrl(BURROW_URL)]
const broker = Nip46Broker.get({clientSecret, relays}) const broker = Nip46Broker.get({clientSecret, relays})
@@ -78,15 +80,16 @@
const userPubkey = await broker.getPublicKey() const userPubkey = await broker.getPublicKey()
await loadUserData(userPubkey)
addSession({ addSession({
email,
method: "nip46", method: "nip46",
pubkey: userPubkey, pubkey: userPubkey,
secret: clientSecret, secret: clientSecret,
handler: {pubkey: response.event.pubkey, relays}, handler: {pubkey: response.event.pubkey, relays},
}) })
await loadUserData(userPubkey)
setChecked("*") setChecked("*")
clearModals() clearModals()
} }
+3 -3
View File
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import {postJson} from "@welshman/lib" import {postJson, assoc} from "@welshman/lib"
import {makeSecret, Nip46Broker} from "@welshman/signer" import {makeSecret, Nip46Broker} from "@welshman/signer"
import {loadHandle} from "@welshman/app" import {pubkey, loadHandle, updateSession} from "@welshman/app"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Field from "@lib/components/Field.svelte" import Field from "@lib/components/Field.svelte"
import FieldInline from "@lib/components/FieldInline.svelte" import FieldInline from "@lib/components/FieldInline.svelte"
@@ -49,7 +49,6 @@
}) })
const signupNsecApp = withLoading(async () => { const signupNsecApp = withLoading(async () => {
const secret = makeSecret()
const handle = await loadHandle(`${username}@${signerDomain}`) const handle = await loadHandle(`${username}@${signerDomain}`)
if (handle?.pubkey) { if (handle?.pubkey) {
@@ -86,6 +85,7 @@
}) })
} }
updateSession($pubkey!, assoc("email", email))
pushToast({message: "Successfully logged in!"}) pushToast({message: "Successfully logged in!"})
setChecked("*") setChecked("*")
clearModals() clearModals()