@randombits/use-siwe
Version:
React hook and API endpoints that provide Sign In With Ethereum support
2 lines • 1.81 kB
JavaScript
import{generateNonce as u,SiweMessage as x}from"siwe";import{fromZodError as h}from"zod-validation-error";import"iron-session";import{z as n}from"zod";var S=n.object({domain:n.string(),address:n.string(),statement:n.string().optional(),uri:n.string(),version:n.string(),chainId:n.number(),nonce:n.string(),issuedAt:n.string().optional(),expirationTime:n.string().optional(),notBefore:n.string().optional(),requestId:n.string().optional(),resources:n.array(n.string()).optional()}),d=n.object({message:S,signature:n.string()});var c=async(e,s)=>e.session.address?s.json({authenticated:!0,address:e.session.address}):(e.session.nonce||(e.session.nonce=u(),await e.session.save()),s.json({authenticated:!1,nonce:e.session.nonce})),p=async(e,s)=>{let{nonce:t}=e.session;if(!t)return s.status(400).send("Bad Request");let o=d.safeParse(e.body);if(!o.success){let y=h(o.error);return s.status(400).send(y.message)}let{message:m,signature:R}=o.data,{success:r,error:a,data:l}=await new x(m).verify({signature:R,nonce:t});return!r&&a?s.status(400).send(a.type):r?(e.session.nonce=void 0,e.session.address=l.address,await e.session.save(),s.send("OK")):s.status(500).send("Unknown Error")},g=async(e,s)=>e.session.address?(e.session.nonce=u(),e.session.address=void 0,await e.session.save(),s.send("OK")):s.status(400).send("Bad Request"),i=(e,s)=>s.status(403).send("Method Not Allowed"),f=(e,s)=>s.status(404).send("Not Found");var B=()=>async(e,s)=>{let{route:t}=e.query;t instanceof Array&&(t=t[0]);let{method:o}=e;switch(t){case void 0:switch(o){case"GET":return c(e,s);default:return i(e,s)}case"signin":switch(o){case"POST":return p(e,s);default:return i(e,s)}case"signout":switch(o){case"POST":return g(e,s);default:return i(e,s)}default:return f(e,s)}};export{B as siweApi};
//# sourceMappingURL=index.js.map