UNPKG

cyphertap

Version:

Nostr, Lightning and Ecash on a single Button component

71 lines (70 loc) 2.59 kB
// src/lib/client/services/logout.ts import { get } from 'svelte/store'; import { BROWSER as browser } from 'esm-env'; // Import all the stores and methods we need to clean up import { logout as nostrLogout, currentUser } from '../stores/nostr.js'; import { clearWallet } from '../stores/wallet.js'; import { appState, InitStatus } from './init.svelte.js'; import { createDebug } from '../utils/debug.js'; // Create debug logger for logout service const d = createDebug('logout'); /** * Clear the Nostr IndexedDB cache for a specific user * @param npub The user's public key */ function clearNostrCache(npub) { if (!browser) return Promise.resolve(); const dbName = `nostr-cache-${npub.slice(0, 8)}`; d.log(`Deleting IndexedDB database: ${dbName}`); return new Promise((resolve, reject) => { const deleteRequest = window.indexedDB.deleteDatabase(dbName); deleteRequest.onerror = (event) => { const error = `Error deleting IndexedDB database: ${dbName}`; d.error(error, event); reject(new Error(error)); }; deleteRequest.onsuccess = () => { d.log(`Successfully deleted IndexedDB database: ${dbName}`); resolve(); }; }); } /** * Complete logout that handles cleaning up all app components * @param options Configuration options for logout * @returns Promise that resolves when logout is complete */ export async function logout(options = {}) { // Set defaults const { clearDatabase = false } = options; try { // Update app state appState.status = InitStatus.IDLE; appState.isInitialized = false; appState.error = null; // 1. Get current user before logout (if we need to clear the database) const user = clearDatabase ? get(currentUser) : null; // 2. Clear the wallet state clearWallet(); // 3. Clear cache if requested if (clearDatabase && user) { d.log('Clearing Nostr database cache'); try { await clearNostrCache(user.npub); d.log('Database cache cleared successfully'); } catch (error) { d.error('Failed to clear database cache:', error); // Continue with logout even if cache clearing fails } } // 4. Use the Nostr logout function to clean up NDK and stored keys nostrLogout(); d.log('Logout complete'); } catch (error) { d.error('Error during logout:', error); throw error; } }