@randombits/use-siwe
Version:
React hook and API endpoints that provide Sign In With Ethereum support
1 lines • 10.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/siweProvider.tsx","../src/useSession.ts","../src/useOptions.ts","../src/useSignIn.ts","../src/useSignOut.ts"],"sourcesContent":["export { SiweProvider } from \"./siweProvider.js\";\nexport { getSession, useSession } from \"./useSession.js\"\nexport { createMessage, getMessageBody, verify, useSignIn } from \"./useSignIn.js\"\nexport { signOut, useSignOut } from \"./useSignOut.js\"\nexport { useOptions } from \"./useOptions.js\"\nexport type { UseSiweOptions } from \"./types.js\"\n","import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport React, { createContext, PropsWithChildren } from \"react\";\nimport { UseSiweOptions } from \"./types.js\";\n\nexport const queryContext = createContext<QueryClient | undefined>(undefined);\nexport const optionsContext = createContext<UseSiweOptions>({});\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30 * 1000,\n },\n },\n});\n\ntype SiweProviderProps = PropsWithChildren & {\n options?: UseSiweOptions,\n};\n\nexport const SiweProvider = ({ children, options = {} }: SiweProviderProps) => (\n <optionsContext.Provider value={options}>\n <QueryClientProvider client={queryClient} context={queryContext}>\n {children}\n </QueryClientProvider>\n </optionsContext.Provider>\n);\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useContext } from \"react\";\nimport { parseOptions } from \"./useOptions.js\";\nimport { queryContext, optionsContext } from \"./siweProvider.js\";\nimport { GetSessionResponse, UseSiweOptions } from \"./types.js\";\n\nexport const getSession = async (options?: UseSiweOptions) => {\n const { baseUrl } = parseOptions(options);\n const res = await fetch(baseUrl);\n if (!res.ok) throw new Error(res.statusText);\n return res.json() as Promise<GetSessionResponse>;\n}\n\nexport const useSession = () => {\n const options = useContext(optionsContext);\n const { data, ...rest } = useQuery({\n queryKey: [\"session\"],\n queryFn: () => getSession(options),\n context: queryContext,\n });\n\n return { ...rest, ...data };\n};\n","import { useContext } from \"react\";\nimport { optionsContext } from \"./siweProvider.js\";\nimport { UseSiweOptions } from \"./types.js\"\n\nconst defaultOptions: Required<UseSiweOptions> = {\n baseUrl: \"/api/auth\",\n}\n\nexport const parseOptions = (options: UseSiweOptions = {}) => {\n return { ...defaultOptions, ...options };\n}\n\nexport const useOptions = () => {\n const options = useContext(optionsContext);\n return parseOptions(options);\n}\n","import { useMutation, useQueryClient, UseQueryOptions } from \"@tanstack/react-query\";\nimport { useContext } from \"react\";\nimport { SiweMessage } from \"siwe\";\nimport { useAccount, useNetwork, useSignMessage } from \"wagmi\";\nimport { parseOptions } from \"./useOptions.js\";\nimport { optionsContext, queryContext } from \"./siweProvider.js\";\nimport { UseSiweOptions } from \"./types.js\";\nimport { useSession } from \"./useSession.js\";\n\ntype UseSignInOptions = Pick<UseQueryOptions<void>, \"onSuccess\" | \"onError\">\ntype MessageArgs = {\n address: string,\n chainId: number,\n nonce: string,\n};\ntype VerifyArgs = {\n message: SiweMessage,\n signature: string,\n};\n\nexport const createMessage = (args: MessageArgs) =>\n new SiweMessage({\n ...args,\n domain: window.location.host,\n uri: window.location.origin,\n version: \"1\",\n });\n\nexport const getMessageBody = ({ message }: { message: SiweMessage }) =>\n message.prepareMessage();\n\nexport const verify = async (args: VerifyArgs, options?: UseSiweOptions) => {\n const { baseUrl } = parseOptions(options);\n const res = await fetch(`${baseUrl}/signin`, {\n headers: { 'Content-Type': 'application/json' },\n method: \"POST\",\n body: JSON.stringify(args),\n });\n\n return res.ok;\n}\n\nexport const useSignIn = ({ onSuccess, onError }: UseSignInOptions = {}) => {\n const { address } = useAccount();\n const { chain } = useNetwork();\n const { nonce } = useSession();\n const { signMessageAsync } = useSignMessage();\n const queryClient = useQueryClient({\n context: queryContext,\n });\n const options = useContext(optionsContext);\n\n const { mutate, mutateAsync, ...rest } = useMutation(\n async () => {\n const message = createMessage({ address, chainId: chain.id, nonce });\n const messageBody = getMessageBody({ message: message });\n const signature = await signMessageAsync({ message: messageBody });\n const result = await verify({ message, signature }, options);\n if (!result) throw new Error(\"Verification Failed\");\n },\n {\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"session\"] });\n if (onSuccess) onSuccess();\n },\n onError,\n context: queryContext,\n },\n );\n\n return { ...rest, signIn: mutate, SignInAsync: mutateAsync };\n};\n","import { useMutation, useQueryClient, UseQueryOptions } from \"@tanstack/react-query\";\nimport { useContext } from \"react\";\nimport { useAccount, useDisconnect } from \"wagmi\";\nimport { parseOptions } from \"./useOptions.js\";\nimport { optionsContext, queryContext } from \"./siweProvider.js\";\nimport { UseSiweOptions } from \"./types.js\";\nimport { useSession } from \"./useSession.js\";\n\ntype UseSignOutOptions = Pick<UseQueryOptions<void>, \"onSuccess\" | \"onError\">\n\nexport const signOut = async (options?: UseSiweOptions) => {\n const { baseUrl } = parseOptions(options);\n const res = await fetch(`${baseUrl}/signout`, { method: \"POST\" });\n if (!res.ok) throw new Error(res.statusText);\n};\n\nexport const useSignOut = ({ onSuccess, onError }: UseSignOutOptions = {}) => {\n const { authenticated } = useSession();\n const { isConnected } = useAccount();\n const { disconnectAsync } = useDisconnect();\n const queryClient = useQueryClient({\n context: queryContext,\n });\n const options = useContext(optionsContext);\n\n const { mutate, mutateAsync, ...rest } = useMutation(\n async () => {\n if (authenticated) await signOut(options);\n if (isConnected) await disconnectAsync();\n },\n {\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"session\"] });\n if (onSuccess) onSuccess();\n },\n onError,\n context: queryContext,\n },\n );\n\n return { ...rest, signOut: mutate, SignOutAsync: mutateAsync };\n};\n"],"mappings":"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","names":["src_exports","__export","SiweProvider","createMessage","getMessageBody","getSession","signOut","useOptions","useSession","useSignIn","useSignOut","verify","__toCommonJS","import_react_query","import_react","queryContext","optionsContext","queryClient","SiweProvider","children","options","React","import_react_query","import_react","import_react","defaultOptions","parseOptions","options","useOptions","optionsContext","getSession","options","baseUrl","parseOptions","res","useSession","optionsContext","data","rest","queryContext","import_react_query","import_react","import_siwe","import_wagmi","createMessage","args","getMessageBody","message","verify","options","baseUrl","parseOptions","useSignIn","onSuccess","onError","address","chain","nonce","useSession","signMessageAsync","queryClient","queryContext","optionsContext","mutate","mutateAsync","rest","messageBody","signature","import_react_query","import_react","import_wagmi","signOut","options","baseUrl","parseOptions","res","useSignOut","onSuccess","onError","authenticated","useSession","isConnected","disconnectAsync","queryClient","queryContext","optionsContext","mutate","mutateAsync","rest"]}