@tenprotocol/session-keys
Version:
Framework-agnostic session key management for TEN Protocol
1 lines • 4.36 kB
Source Map (JSON)
{"version":3,"sources":["../src/react/index.ts","../src/core/state.ts"],"sourcesContent":["import { useState, useEffect } from 'react'\nimport type { SessionKeyState } from '../types'\nimport { getState, subscribeToState } from '../core/state'\n\n/**\n * React hook for subscribing to session key state\n * \n * @example\n * ```tsx\n * import { useSessionKeyState } from '@tenprotocol/session-keys/react'\n * \n * function MyComponent() {\n * const { sessionKey, isActive, balance, isLoading, error } = useSessionKeyState()\n * \n * return (\n * <div>\n * <p>Session Key: {sessionKey}</p>\n * <p>Active: {isActive ? 'Yes' : 'No'}</p>\n * <p>Balance: {balance?.eth} ETH</p>\n * {isLoading && <p>Loading...</p>}\n * {error && <p>Error: {error.message}</p>}\n * </div>\n * )\n * }\n * ```\n */\nexport const useSessionKeyState = (): SessionKeyState => {\n const [state, setState] = useState<SessionKeyState>(getState)\n\n useEffect(() => {\n const unsubscribe = subscribeToState(setState)\n return unsubscribe\n }, [])\n\n return state\n}","import type { SessionKeyState, StateSubscriber } from '../types'\n\n// Internal state\nlet state: SessionKeyState = {\n sessionKey: null,\n isActive: false,\n balance: null,\n isLoading: false,\n error: null\n}\n\n// Subscribers\nconst subscribers = new Set<StateSubscriber>()\n\n// Simple mutex for state updates\nlet isUpdating = false\n\n// Load persisted state on init\ntry {\n const persisted = localStorage.getItem('ten-session-key-state')\n if (persisted) {\n const parsed = JSON.parse(persisted)\n state = {\n ...state,\n sessionKey: parsed.sessionKey,\n isActive: parsed.isActive\n }\n }\n} catch (error) {\n console.warn('Failed to load persisted state:', error)\n}\n\nexport const getState = (): SessionKeyState => ({ ...state })\n\nexport const updateState = async (updates: Partial<SessionKeyState>): Promise<void> => {\n // Wait if another update is in progress\n while (isUpdating) {\n await new Promise(resolve => setTimeout(resolve, 50))\n }\n \n try {\n isUpdating = true\n state = { ...state, ...updates }\n \n // Persist key state changes\n if ('sessionKey' in updates || 'isActive' in updates) {\n try {\n localStorage.setItem('ten-session-key-state', JSON.stringify({\n sessionKey: state.sessionKey,\n isActive: state.isActive\n }))\n } catch (error) {\n console.warn('Failed to persist state:', error)\n }\n }\n\n // Notify all subscribers\n subscribers.forEach(callback => {\n try {\n callback(getState())\n } catch (error) {\n console.error('Error in state subscriber:', error)\n }\n })\n } finally {\n isUpdating = false\n }\n}\n\nexport const subscribeToState = (callback: StateSubscriber): (() => void) => {\n subscribers.add(callback)\n return () => {\n subscribers.delete(callback)\n }\n}\n\nexport const clearPersistedState = (): void => {\n try {\n localStorage.removeItem('ten-session-key-state')\n } catch (error) {\n console.warn('Failed to clear persisted state:', error)\n }\n}\n\n// State getters\nexport const getSessionKey = (): string | null => state.sessionKey\nexport const getIsActive = (): boolean => state.isActive\nexport const getBalance = (): SessionKeyState['balance'] => state.balance\nexport const getIsLoading = (): boolean => state.isLoading\nexport const getError = (): Error | null => state.error"],"mappings":"AAAA,OAAS,YAAAA,EAAU,aAAAC,MAAiB,QCGpC,IAAIC,EAAyB,CAC3B,WAAY,KACZ,SAAU,GACV,QAAS,KACT,UAAW,GACX,MAAO,IACT,EAGMC,EAAc,IAAI,IAMxB,GAAI,CACF,IAAMC,EAAY,aAAa,QAAQ,uBAAuB,EAC9D,GAAIA,EAAW,CACb,IAAMC,EAAS,KAAK,MAAMD,CAAS,EACnCE,EAAQ,CACN,GAAGA,EACH,WAAYD,EAAO,WACnB,SAAUA,EAAO,QACnB,CACF,CACF,OAASE,EAAO,CACd,QAAQ,KAAK,kCAAmCA,CAAK,CACvD,CAEO,IAAMC,EAAW,KAAwB,CAAE,GAAGF,CAAM,GAqCpD,IAAMG,EAAoBC,IAC/BC,EAAY,IAAID,CAAQ,EACjB,IAAM,CACXC,EAAY,OAAOD,CAAQ,CAC7B,GD/CK,IAAME,EAAqB,IAAuB,CACvD,GAAM,CAACC,EAAOC,CAAQ,EAAIC,EAA0BC,CAAQ,EAE5D,OAAAC,EAAU,IACYC,EAAiBJ,CAAQ,EAE5C,CAAC,CAAC,EAEED,CACT","names":["useState","useEffect","state","subscribers","persisted","parsed","state","error","getState","subscribeToState","callback","subscribers","useSessionKeyState","state","setState","useState","getState","useEffect","subscribeToState"]}