(()=>{vari=class{constructor(){}asyncregister(){letn=awaitthis.getCreateOptions(),e={challenge:this.base64URLStringToBuffer(n.challenge),rp:{id:n.rp.id,name:n.rp.name},user:{id:newTextEncoder().encode(window.atob(n.user.id)),name:n.user.name,displayName:n.user.displayName},pubKeyCredParams:n.pubKeyCredParams,excludeCredentials:[],authenticatorSelection:n.authenticatorSelection,timeout:6e4},t=awaitnavigator.credentials.create({publicKey:e});if(!t)thrownewError("Error generating a passkey");letr={id:t.id?t.id:null,type:t.type?t.type:null,rawId:t.rawId?this.bufferToBase64URLString(t.rawId):null,response:{attestationObject:t.response.attestationObject?this.bufferToBase64URLString(t.response.attestationObject):null,clientDataJSON:t.response.clientDataJSON?this.bufferToBase64URLString(t.response.clientDataJSON):null}};if(!(awaitwindow.fetch("/admin/passkeys/register",{method:"POST",body:JSON.stringify(r),cache:"no-cache",headers:{"Content-Type":"application/json","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]').getAttribute("content")}})).ok)thrownewError("Error saving the passkey");window.location.reload()}asyncgetCreateOptions(){returnawait(awaitfetch("/admin/passkeys/register",{method:"GET"})).json()}asynclogin(){letn=awaitthis.getLoginData(),e=awaitnavigator.credentials.get({publicKey:{challenge:this.base64URLStringToBuffer(n.challenge),userVerification:n.userVerification,timeout:6e4}});if(!e)thrownewError("Authentication failed");lett={id:e.id?e.id:"",type:e.type?e.type:"",rawId:e.rawId?this.bufferToBase64URLString(e.rawId):"",response:{authenticatorData:e.response.authenticatorData?this.bufferToBase64URLString(e.response.authenticatorData):"",clientDataJSON:e.response.clientDataJSON?this.bufferToBase64URLString(e.response.clientDataJSON):"",signature:e.response.signature?this.bufferToBase64URLString(e.response.signature):"",userHandle:e.response.userHandle?this.bufferToBase64URLString(e.response.userHandle):""}};if(!(awaitwindow.fetch("/login/passkey",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]').getAttribute("content")}})).ok)thrownewError("Login failed");window.location.assign("/admin")}asyncgetLoginData(){returnawait(awaitfetch("/login/passkey",{method:"GET"})).json()}base64URLStringToBuffer(n){lete=n.replace(/-/g,"+").replace(/_/g,"/"),t=(4-e.length%4)%4,r=e.padEnd(e.length+t,"="),a=window.atob(r),c=newArrayBuffer(a.length),d=newUint8Array(c);for(leto=0;o<a.length;o++)d[o]=a.charCodeAt(o);returnc}bufferToBase64URLString(n){lete=newUint8Array(n),t="";for(letaofe)t+=String.fromCharCode(a);returnbtoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}};varl=newi;document.querySelectorAll(".add-passkey").forEach(s=>{s.addEventListener("click",()=>{l.register()})});document.querySelectorAll(".login-passkey").forEach(s=>{s.addEventListener("click",()=>{l.login()})});})();