diff --git a/packages/svelte/src/lib/auth.ts b/packages/svelte/src/lib/auth.ts new file mode 100644 index 0000000..5cf34a9 --- /dev/null +++ b/packages/svelte/src/lib/auth.ts @@ -0,0 +1,129 @@ +import Gun from "gun"; +import "gun-eth"; +import { getAccount } from "@wagmi/core"; +import { currentUser, gun } from "$lib/stores"; +import { get } from "svelte/store"; +import { notification } from "$lib/utils/scaffold-eth/notification"; +import { wagmiConfig } from "$lib/wagmi"; +import type { IGunUserInstance } from "gun/types"; + +const MESSAGE_TO_SIGN = "Accesso a GunDB con Ethereum"; + +export function initializeAuth(gunInstance: Gun): IGunUserInstance { + const user: IGunUserInstance = gunInstance.user(); + + user.recall({ sessionStorage: true }, async ack => { + if ("err" in ack) { + console.error("Errore nel recupero della sessione:", ack.err); + } else if (user.is && user.is.alias) { + currentUser.set(user.is.alias as string); + await loadUserData(user); + } + }); + + user.on("auth", async () => { + console.log("Utente autenticato:", user.is.alias as string); + currentUser.set(user.is.alias as string); + await loadUserData(user); + }); + + return user; +} + +async function loadUserData(user: IGunUserInstance) { + console.log("Caricamento dati utente..."); + const gunInstance = get(gun); + const account = getAccount(wagmiConfig); + + if (user.is && user.is.alias) { + const signature = await gunInstance.createSignature(MESSAGE_TO_SIGN); + const userPair = await gunInstance.getAndDecryptPair(account.address, signature); + console.log("Coppia utente:", userPair); + // Qui puoi aggiungere la logica per gestire i dati dell'utente + } +} + +export async function registra(user: IGunUserInstance): Promise { + console.log("Registrazione in corso..."); + const gunInstance = get(gun); + const account = getAccount(wagmiConfig); + + try { + if (!account.isConnected) { + return "Per favore connetti il tuo portafoglio Ethereum"; + } + + const signature = await gunInstance.createSignature(MESSAGE_TO_SIGN); + + if (!signature) { + return "Errore durante la firma del messaggio"; + } + + await gunInstance.createAndStoreEncryptedPair(account.address, signature); + + return new Promise(resolve => { + user.create(account.address, signature, async (ack: { ok: 0; pub: string } | { err: string }) => { + if ("err" in ack) { + resolve("Errore durante la registrazione: " + ack.err); + } else { + await loadUserData(user); + currentUser.set(user.is.alias); + resolve(null); + } + }); + }); + } catch (error) { + return "Errore durante la registrazione: " + error.message; + } +} + +export async function accedi(user: IGunUserInstance): Promise { + const account = getAccount(wagmiConfig); + + if (!account.isConnected) { + notification.error("Nessun account Ethereum connesso"); + return "Nessun account Ethereum connesso"; + } + + console.log("Accesso in corso..."); + const gunInstance = get(gun); + + try { + if (!account.address) { + return "Nessun account Ethereum connesso"; + } + + const signature = await gunInstance.createSignature(MESSAGE_TO_SIGN); + if (!signature) { + return "Errore durante la firma del messaggio"; + } + + const pair = await gunInstance.getAndDecryptPair(account.address, signature); + console.log("Pair:", pair); + if (!pair) { + return "Errore nel recupero del pair dell'utente"; + } + + return new Promise(resolve => { + user.auth(pair, async (ack: { err: string }) => { + console.log("Risposta di autenticazione:", ack); + if (ack.err) { + resolve("Errore di accesso: " + ack.err); + } else { + console.log("Accesso riuscito"); + currentUser.set(user.is.alias); + await loadUserData(user); + resolve(null); + } + }); + }); + } catch (error) { + return "Errore durante l'accesso: " + error.message; + } +} + +export function esci(user: IGunUserInstance): void { + user.leave(); + currentUser.set(null); + // Puoi aggiungere qui altre operazioni di pulizia se necessario +} diff --git a/packages/svelte/src/lib/gun.ts b/packages/svelte/src/lib/gun.ts index 180fefe..2f7579b 100644 --- a/packages/svelte/src/lib/gun.ts +++ b/packages/svelte/src/lib/gun.ts @@ -29,29 +29,29 @@ let gun; * import { useGun } from '@gun-vue/composables' * const gun = useGun() */ -export function createGun(options = { localStorage: false }) { - if (!gun) { - const opts = { peers: peers }; - if (typeof options === "object") { - Object.assign(opts, options); - } - console.log(opts.peers); - gun = Gun(opts); +export function useGun(options = { localStorage: false }) { + if (!gun) { + const opts = { peers: peers }; + if (typeof options === "object") { + Object.assign(opts, options); } - return gun; + console.log(opts.peers); + gun = Gun(opts); + } + return gun; } /** * @param {...string} args * @returns {import('gun').IGunInstance} */ -export function createGunPath(...args) { - const gun = createGun(); - let g; - for (let arg of args) { - g = gun.get(arg); - } - return g || gun; +export function useGunPath(...args) { + const gun = useGun(); + let g; + for (let arg of args) { + g = gun.get(arg); + } + return g || gun; } /** @@ -60,8 +60,8 @@ export function createGunPath(...args) { * @returns {import('gun').IGunInstance} */ export function createGunSecondary(options = { localStorage: false }) { - const gun2 = Gun({ peers: peers, ...options }); - return gun2; + const gun2 = Gun({ peers: peers, ...options }); + return gun2; } /** @@ -86,20 +86,19 @@ export const soul = Gun?.node?.soul; */ export const genUUID = Gun?.text?.random; - /** - * Authorized Puts + * Authorized Puts */ -Gun.on('opt', function (ctx) { - if (ctx.once) { - return - } - ctx.on('out', function (msg) { - var to = this.to - // Adds headers for put - msg.headers = { - token: 'test' - } - to.next(msg) // pass to next middleware - }) -}) +Gun.on("opt", function (ctx) { + if (ctx.once) { + return; + } + ctx.on("out", function (msg) { + var to = this.to; + // Adds headers for put + msg.headers = { + token: "test", + }; + to.next(msg); // pass to next middleware + }); +}); diff --git a/packages/svelte/src/routes/auth/+page.svelte b/packages/svelte/src/routes/auth/+page.svelte index 8c9af70..ab6a01f 100644 --- a/packages/svelte/src/routes/auth/+page.svelte +++ b/packages/svelte/src/routes/auth/+page.svelte @@ -7,152 +7,79 @@ import { currentUser, gun } from "$lib/stores"; import { get } from "svelte/store"; import { notification } from "$lib/utils/scaffold-eth/notification"; - const { address, chainId, status, isConnected } = $derived.by(createAccount()); // createAccount is the Svelte version of useAccount - + import { initializeAuth, registra, accedi, esci } from "$lib/auth"; import type { IGunUserInstance } from "gun/types"; - import { createAccount } from "@byteatatime/wagmi-svelte"; - - let user: IGunUserInstance = { - recall: (options: { sessionStorage: boolean }, callback: (ack: any) => Promise) => {}, - is: { alias: null }, - on: (event: string, callback: () => Promise) => {}, - create: (alias: any, pass: any, callback: (ack: any) => Promise) => {}, - auth: (alias: any, pass: any, callback: (ack: any) => Promise) => {}, - leave: () => {}, - }; - - let errorMessage = ""; - let account: any = null; - let userPair: ArrayLike | { [s: string]: unknown } | null = null; - let signature: null = null; - const MESSAGE_TO_SIGN = "Accesso a GunDB con Ethereum"; + let user: IGunUserInstance; + let errorMessage: string | null = null; + let userPair: Record | null = null; onMount(() => { const gunInstance = get(gun); if (gunInstance) { - user = gunInstance?.user(); + user = initializeAuth(gunInstance); } else { - console.error("Istanza di Gun non inizializzata correttamente"); + setErrorMessage("Istanza di Gun non inizializzata correttamente"); } - account = getAccount(wagmiConfig); - - user.recall({ sessionStorage: true }, async ack => { - if ("err" in ack) { - console.error("Errore nel recupero della sessione:", ack.err); - } else if (user.is && user.is.alias) { - currentUser.set(user.is.alias as string); - await loadUserData(); - } - }); - - user.on("auth", async () => { - console.log("Utente autenticato:", user.is.alias as string); - currentUser.set(user.is.alias as string); - await loadUserData(); - }); }); - async function loadUserData() { - console.log("Loading user data..."); - currentUser.subscribe(value => currentUser.set(value)); - const gunInstance = get(gun) || {}; // Aggiunta di un fallback per evitare null - - if (currentUser) { - userPair = await gunInstance?.getAndDecryptPair(account.address, signature); - console.log("User Pair:", userPair); + function setErrorMessage(message: string | null) { + errorMessage = message; + if (message) { + setTimeout(() => { + errorMessage = null; + }, 5000); // Il messaggio di errore scomparirà dopo 5 secondi } } - async function registra() { - console.log("Registrazione in corso..."); - errorMessage = ""; - const gunInstance = get(gun) || {}; // Aggiunta di un fallback per evitare null - account = getAccount(wagmiConfig); - user = gunInstance.user(); - - try { - if (!isConnected) { - errorMessage = "Please connect your Ethereum wallet"; - return; - } - - signature = await (gunInstance as any).createSignature(MESSAGE_TO_SIGN); - - if (!signature) { - errorMessage = "Errore durante la firma del messaggio"; - return; - } - - await (gunInstance as any).createAndStoreEncryptedPair(account.address, signature); + async function handleRegistra() { + const result = await registra(user); + if (result) { + setErrorMessage(result); + } else { + notification.success("Registrazione completata con successo!"); + } + } - user.create(account.address, signature, async (ack: { ok: 0; pub: string } | { err: string }) => { - if ("err" in ack) { - errorMessage = "Errore durante la registrazione: " + ack.err; - } else { - alert("Registrazione completata! Ora puoi accedere."); - await loadUserData(); - currentUser.set(user.is.alias); - } - }); - } catch (error) { - errorMessage = "Errore durante la registrazione: " + error.message; + async function handleAccedi() { + const result = await accedi(user); + if (result) { + setErrorMessage(result); + } else { + notification.success("Accesso effettuato con successo!"); } } - async function accedi() { - account = getAccount(wagmiConfig); + function handleEsci() { + esci(user); + userPair = null; + notification.info("Logout effettuato"); + } + + async function handleViewPair() { + const gunInstance = get(gun); + const account = getAccount(wagmiConfig); - if (!isConnected) { - notification.error("Nessun account Ethereum connesso"); + if (!account.isConnected) { + setErrorMessage("Per favore connetti il tuo portafoglio Ethereum"); return; } - console.log("Accesso in corso..."); - errorMessage = ""; - const gunInstance = get(gun); // Aggiunta di un fallback per evitare null - user = gunInstance.user(); try { - account = getAccount(wagmiConfig); - if (!account.address) { - errorMessage = "Nessun account Ethereum connesso"; - return; - } - - signature = await gunInstance.createSignature(MESSAGE_TO_SIGN); + const signature = await gunInstance.createSignature("Accesso a GunDB con Ethereum"); if (!signature) { - errorMessage = "Errore durante la firma del messaggio"; + setErrorMessage("Errore durante la firma del messaggio"); return; } - const pair = await gunInstance.getAndDecryptPair(account.address, signature); - console.log("Pair:", pair); - if (!pair) { - errorMessage = "Errore nel recupero del pair dell'utente"; - return; + userPair = await gunInstance.getAndDecryptPair(account.address, signature); + if (!userPair) { + setErrorMessage("Impossibile recuperare i dati dell'utente"); } - - user.auth(pair, async (ack: { err: string }) => { - console.log("Risposta di autenticazione:", ack); - if (ack.err) { - errorMessage = "Errore di accesso: " + ack.err; - } else { - console.log("Accesso riuscito"); - currentUser.set(user.is.alias); - await loadUserData(); - } - }); } catch (error) { - errorMessage = "Errore durante l'accesso: " + error.message; + setErrorMessage("Errore durante il recupero del pair: " + error.message); } } - - function esci() { - user.leave(); - currentUser.set(null); - userPair = null; - errorMessage = ""; - }
@@ -164,12 +91,12 @@ {#if $currentUser === null}
- - + +
{:else}
-

Welcome, {$currentUser}!

+

Benvenuto, {$currentUser}!

{#if userPair && Object.keys(userPair).length > 0}
@@ -183,8 +110,8 @@
{/if}
- - + +
{/if}