UNPKG

@nopwdio/sdk-js

Version:
2 lines (1 loc) 3.86 kB
import{f as D}from"./chunk-4DGRMKHT.js";import{b as k}from"./chunk-XGY7T5A3.js";import{a as j,b as B}from"./chunk-VS4C5FIV.js";import{a as E,b as h,d as _,f as b,g as S,h as f,s as x}from"./chunk-EX74VC7J.js";var v=async function(){return crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!1,["sign"])},K=async function(t,e){return crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},e,t)};var w=class{constructor(){this.locked=!1,this.queue=[]}lock(){return new Promise(e=>{this.locked?this.queue.push(e):(this.locked=!0,e(void 0))})}unlock(){this.queue.length>0?this.queue.shift()():this.locked=!1}};var O=function(t,e){return new Promise((n,s)=>{typeof indexedDB>"u"&&s(new Error("indexedDB is undefined"));let o=indexedDB.open(t);o.onerror=r=>{s(new Error(`can't open db '${t}' - ${r.target.error}`))},o.onupgradeneeded=r=>{let a=r.target.result;e.forEach(c=>{a.createObjectStore(c.name,{keyPath:c.id,autoIncrement:c.auto})})},o.onsuccess=r=>{n(r.target.result)}})};var P=async function(t,e,n){let s=await I(t,e);return new Promise((o,r)=>{s.get(n).onsuccess=a=>{o(a.target.result)}})},T=async function(t,e,n){let s=await I(t,e);return new Promise((o,r)=>{s.put(n).onsuccess=a=>{o(a.target.result)}})},l=async function(t,e,n){let s=await I(t,e);return new Promise((o,r)=>{s.delete(n).onsuccess=a=>{o(a.target.result)}})},I=function(t,e){return new Promise((n,s)=>{let o=t.transaction([e],"readwrite");o.onerror=a=>{s(a)};let r=o.objectStore(e);n(r)})};var i,q=new w,y=[],C,te=async function(t,e,n){try{let s=Math.round(Date.now()/1e3),o=await v(),r=await crypto.subtle.exportKey("jwk",o.publicKey);e=e||24*60*60,n=n||e;let{session_id:a,next_challenge:c,idle_timeout:m,expires_at:p,created_at:A,created_with:g,used_at:F}=await f({method:"POST",ressource:"/sessions",data:{public_key:r,idle_timeout:n,lifetime:e,access_token:t}}),L=await u(),M={id:"current",session_id:a,next_challenge:c,private_key:o.privateKey,created_at:s,created_with:g,expires_at:p,idle_timeout:m};return await T(L,"sessions",M),i={token:t,token_payload:k(t),created_at:A,created_with:g,expires_at:p,idle_timeout:m,suggest_passkeys:await D()&&!g.includes("webauthn")},d(i),i}catch(s){throw s instanceof h||s instanceof S||s instanceof E?s:new x(s)}},$=async function(){await q.lock();try{let t=Math.round(Date.now()/1e3);return i&&i.token_payload.exp>t+60||(i=await N(),d(i)),i}catch(t){if(t instanceof _||t instanceof b){let e=await u();return await l(e,"sessions","current"),d(null),null}throw t}finally{q.unlock()}},ne=async function(){let t=await u();try{let e=await P(t,"sessions","current");if(!e)return;await f({method:"DELETE",ressource:`/sessions/${e.session_id}`})}catch(e){throw e instanceof h||e instanceof S?e:new x(e)}finally{await l(t,"sessions","current"),d(null)}},N=async function(){try{let t=Math.round(Date.now()/1e3),e=await u(),n=await P(e,"sessions","current");if(!n)return null;if(n.expires_at<t){let p=await u();return await l(p,"sessions","current"),null}let s=B(n.next_challenge),o=await K(s,n.private_key),{access_token:r,next_challenge:a}=await f({method:"POST",ressource:`/sessions/${n.session_id}/tokens`,data:{signature:j(o)}}),c=k(r);return n.next_challenge=a,await T(e,"sessions",n),{token:r,token_payload:c,created_at:n.created_at,created_with:n.created_with,expires_at:n.expires_at,idle_timeout:n.idle_timeout,suggest_passkeys:await D()&&!n.created_with.includes("webauthn")}}catch(t){if(t instanceof _||t instanceof b){let e=await u();return await l(e,"sessions","current"),d(null),null}throw t}},se=async function(t){y.push(t),t(await $())},oe=function(t){y.some((e,n)=>t===e?(y.splice(n,1),!0):!1)},d=function(t){i=t,clearTimeout(C),i&&(C=window.setTimeout(()=>{d(null)},i.idle_timeout*1e3)),y.forEach(e=>{e(t)})},u=async function(){return O("nopwd",[{name:"sessions",id:"id",auto:!1}])};export{te as a,$ as b,ne as c,se as d,oe as e};