@enbox/browser 0.3.39 → 0.3.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import{AuthManager as je,AuthSession as Ge,normalizeProtocolRequests as Ye,WalletConnect as Ve}from"@enbox/auth/browser";import{DidDht as ae,DidWeb as se,UniversalResolver as V}from"@enbox/dids";function D(e){let t=e.indexOf("://dweb/");if(t===-1)return null;let n=e.slice(0,t);if(n!=="http"&&n!=="https")return null;let o=e.slice(t+8);if(o.length===0)return null;let r=o.indexOf("/");return r===-1?[o,""]:r===0?null:[o.slice(0,r),o.slice(r+1)]}var _=new V({didResolvers:[ae,se]}),J=/^http:/,O=/\/$/,Z="drl";async function Q(e){let{didDocument:t}=await _.resolve(e),n=t?.service?.find(o=>o.type==="DecentralizedWebNode")?.serviceEndpoint;return n?(Array.isArray(n)?n:[n]).filter(o=>typeof o=="string"&&o.startsWith("http")):[]}async function X(){if(!(typeof caches>"u"))return caches.open(Z)}async function le(e,t,n,o){let r=e.request.url.replace(J,"https:").replace(O,""),i=await X(),s=await i?.match(r);if(s){if(!navigator.onLine)return s;let a=await o?.onCacheCheck?.(e,r);if(a){let d=s.headers.get("dwn-cache-time");if(d&&Date.now()<Number(d)+(Number(a.ttl)||0))return s}}try{if(n)return await ce(e,t,r,n,i,o);{let a=await _.resolve(t);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})}}catch(a){return a instanceof Response?a:(console.log(`Error in DID URL fetch: ${a}`),new Response("DID URL fetch error",{status:500}))}}async function ce(e,t,n,o,r,i){let s=await Q(t);if(!s?.length)throw new Response("DWeb Node resolution failed: no valid endpoints found.",{status:530});let a;for(let d of s)try{let l=`${d.replace(O,"")}/${t}/${o}`,c=await fetch(l,{headers:e.request.headers});if(c.ok)return await i?.onCacheCheck?.(e,n)&&r&&de(n,l,c,r),c;console.log(`DWN endpoint error: ${c.status}`),a=new Response("DWeb Node request failed",{status:c.status})}catch(l){console.log(`DWN endpoint error: ${l}`),a=new Response("DWeb Node request failed",{status:500})}return a}async function de(e,t,n,o){try{let r=n.clone(),i=new Headers(r.headers);i.append("dwn-cache-time",Date.now().toString()),i.append("dwn-composed-url",t);let s=new Response(r.body,{headers:i});await o.put(e,s)}catch(r){console.log(`Failed to cache DRL response: ${r}`)}}async function pe(e={}){try{if(typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope){let t=self;t.skipWaiting(),t.addEventListener("activate",n=>{n.waitUntil(t.clients.claim())}),t.addEventListener("fetch",n=>{let o=D(n.request.url);o&&n.respondWith(le(n,o[0],o[1],e))})}else if(globalThis?.navigator?.serviceWorker){if(!await navigator.serviceWorker.getRegistration("/")){let n=e.path||document?.currentScript?.src||import.meta.url;n&&navigator.serviceWorker.register(n,{type:"module"}).catch(o=>{console.error("DWeb networking feature installation failed: ",o)})}}else throw new Error("DWeb networking features are not available for install in this environment")}catch(t){console.error("Error in installing networking features:",t)}}var ee=`
1
+ import{Enbox as ot,defineProtocol as rt,repository as it}from"@enbox/api";import{AuthManager as at,AuthSession as lt,normalizeProtocolRequests as dt,WalletConnect as ct}from"@enbox/auth/browser";import{CONNECT_DENIED_TOKEN as ut,ConnectProvider as mt}from"@enbox/connect";import{DidDht as le,DidWeb as de,UniversalResolver as ee}from"@enbox/dids";function b(n){let e=n.indexOf("://dweb/");if(e===-1)return null;let t=n.slice(0,e);if(t!=="http"&&t!=="https")return null;let o=n.slice(e+8);if(o.length===0)return null;let r=o.indexOf("/");return r===-1?[o,""]:r===0?null:[o.slice(0,r),o.slice(r+1)]}var j=new ee({didResolvers:[le,de]}),te=/^http:/,L=/\/$/,ne="drl";async function oe(n){let{didDocument:e}=await j.resolve(n),t=e?.service?.find(o=>o.type==="DecentralizedWebNode")?.serviceEndpoint;return t?(Array.isArray(t)?t:[t]).filter(o=>typeof o=="string"&&o.startsWith("http")):[]}async function re(){if(!(typeof caches>"u"))return caches.open(ne)}async function ce(n,e,t,o){let r=n.request.url.replace(te,"https:").replace(L,""),i=await re(),a=await i?.match(r);if(a){if(!navigator.onLine)return a;let s=await o?.onCacheCheck?.(n,r);if(s){let u=a.headers.get("dwn-cache-time");if(u&&Date.now()<Number(u)+(Number(s.ttl)||0))return a}}try{if(t)return await pe(n,e,r,t,i,o);{let s=await j.resolve(e);return new Response(JSON.stringify(s),{status:200,headers:{"Content-Type":"application/json"}})}}catch(s){return s instanceof Response?s:(console.log(`Error in DID URL fetch: ${s}`),new Response("DID URL fetch error",{status:500}))}}async function pe(n,e,t,o,r,i){let a=await oe(e);if(!a?.length)throw new Response("DWeb Node resolution failed: no valid endpoints found.",{status:530});let s;for(let u of a)try{let l=`${u.replace(L,"")}/${e}/${o}`,c=await fetch(l,{headers:n.request.headers});if(c.ok)return await i?.onCacheCheck?.(n,t)&&r&&ue(t,l,c,r),c;console.log(`DWN endpoint error: ${c.status}`),s=new Response("DWeb Node request failed",{status:c.status})}catch(l){console.log(`DWN endpoint error: ${l}`),s=new Response("DWeb Node request failed",{status:500})}return s}async function ue(n,e,t,o){try{let r=t.clone(),i=new Headers(r.headers);i.append("dwn-cache-time",Date.now().toString()),i.append("dwn-composed-url",e);let a=new Response(r.body,{headers:i});await o.put(n,a)}catch(r){console.log(`Failed to cache DRL response: ${r}`)}}async function me(n={}){try{if(typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope){let e=self;e.skipWaiting(),e.addEventListener("activate",t=>{t.waitUntil(e.clients.claim())}),e.addEventListener("fetch",t=>{let o=b(t.request.url);o&&t.respondWith(ce(t,o[0],o[1],n))})}else if(globalThis?.navigator?.serviceWorker){if(!await navigator.serviceWorker.getRegistration("/")){let t=n.path||document?.currentScript?.src||import.meta.url;t&&navigator.serviceWorker.register(t,{type:"module"}).catch(o=>{console.error("DWeb networking feature installation failed: ",o)})}}else throw new Error("DWeb networking features are not available for install in this environment")}catch(e){console.error("Error in installing networking features:",e)}}var ie=`
2
2
  .drl-loading-overlay {
3
3
  position: fixed;
4
4
  inset: 0;
@@ -103,7 +103,7 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
103
103
  opacity: 0;
104
104
  }
105
105
  }
106
- `,ue=`
106
+ `,fe=`
107
107
  <!DOCTYPE html>
108
108
  <html lang='en'>
109
109
  <head>
@@ -119,7 +119,7 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
119
119
  font-family: Arial, sans-serif;
120
120
  text-align: center;
121
121
  }
122
- ${ee}
122
+ ${ie}
123
123
  </style>
124
124
  </head>
125
125
  <body>
@@ -132,8 +132,8 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
132
132
  </div>
133
133
  </body>
134
134
  </html>
135
- `,T=!1,x=null,L=null;function Y(){T||(L=document.createElement("style"),L.innerHTML=`
136
- ${ee}
135
+ `,M=!1,f=null,_=null;function Z(){M||(_=document.createElement("style"),_.innerHTML=`
136
+ ${ie}
137
137
 
138
138
  .drl-loading-overlay {
139
139
  opacity: 0;
@@ -145,13 +145,13 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
145
145
  opacity: 1;
146
146
  pointer-events: all;
147
147
  }
148
- `,document.head.append(L),x=document.createElement("div"),x.classList.add("drl-loading-overlay"),x.innerHTML=`
148
+ `,document.head.append(_),f=document.createElement("div"),f.classList.add("drl-loading-overlay"),f.innerHTML=`
149
149
  <div class='drl-loading-spinner'>
150
150
  <div></div>
151
151
  Loading DRL
152
152
  </div>
153
153
  <span tabindex='0'></span>
154
- `,x.lastElementChild.addEventListener("click",I),document.body.prepend(x),T=!0)}function me(){T&&(L?.remove(),L=null,x?.remove(),x=null,T=!1)}function I(){document.documentElement.removeAttribute("drl-link-loading"),K=null}var K=null,N=!1,A=null,W=null;function fe(){N||(A=async e=>{let t=e.target?.closest("a");if(t){let n=t.href,o=D(n);if(o){let r=o[0],i=o[1],s=t.target==="_blank";e.preventDefault();try{let a=null;s?(a=window.open("","_blank"),a&&a.document.write(ue)):(K=i,setTimeout(()=>document.documentElement.setAttribute("drl-link-loading",""),50));let d=await Q(r);if(!d.length)throw new Error("no valid DWN endpoints found");let l=`${d[0].replace(O,"")}/${r}/${i}`;s?a&&!a.closed&&(a.location.href=l):K===i&&(window.location.href=l)}catch{throw K===i&&I(),new Error(`DID endpoint resolution failed for the DRL: ${n}`)}}}},W=async e=>{let t=e.composedPath()[0];if(e.pointerType==="mouse"&&e.button===2||e.pointerType==="touch"&&e.isPrimary){if(P(),t?.src&&D(t.src)){E=t,t.__src__=t.src;let n=t.src.replace(J,"https:").replace(O,""),r=await(await X())?.match(n);if(r){let i=r.headers.get("dwn-composed-url");i&&(t.src=i)}t.addEventListener("pointerup",P,{once:!0})}}else t===E&&P()},document.addEventListener("click",A),document.addEventListener("pointercancel",P),document.addEventListener("pointerdown",W),N=!0)}function ge(){N&&(A&&(document.removeEventListener("click",A),A=null),W&&(document.removeEventListener("pointerdown",W),W=null),document.removeEventListener("pointercancel",P),P(),I(),N=!1)}var E=null;async function P(e){e?.type==="pointerup"&&await new Promise(t=>requestAnimationFrame(()=>t())),E&&(E.src=E.__src__,delete E.__src__,E=null)}function Le(e={}){e.didResolvers&&(_=new V({didResolvers:e.didResolvers})),e.serviceWorker!==!1&&pe(e),typeof window<"u"&&typeof window.document<"u"&&(e.injectStyles!==!1&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Y,{once:!0}):Y()),e.links!==!1&&fe())}function Ae(){typeof window<"u"&&typeof window.document<"u"&&(ge(),me())}async function We(){return typeof caches>"u"?!1:caches.delete(Z)}var te={name:"ECDH",namedCurve:"P-256"},ye={name:"AES-GCM",length:256},he=new TextEncoder().encode("dweb-connect-v1");async function z(){let e=await crypto.subtle.generateKey(te,!1,["deriveBits"]),t=await crypto.subtle.exportKey("raw",e.publicKey);return{keyPair:e,publicKeyBase64url:B(new Uint8Array(t))}}async function ne(e,t){let n=F(t),o=await crypto.subtle.importKey("raw",n,te,!1,[]),r=await crypto.subtle.deriveBits({name:"ECDH",public:o},e,256),i=await crypto.subtle.importKey("raw",r,"HKDF",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"HKDF",hash:"SHA-256",salt:new Uint8Array(32),info:he},i,ye,!1,["encrypt","decrypt"])}async function we(e,t,n,o){let r=await ne(t.privateKey,o),i=crypto.getRandomValues(new Uint8Array(12)),s=new TextEncoder().encode(JSON.stringify(e)),a=await crypto.subtle.encrypt({name:"AES-GCM",iv:i},r,s);return{ciphertext:B(new Uint8Array(a)),iv:B(i),walletPublicKey:n}}async function oe(e,t){let n=await ne(t.privateKey,e.walletPublicKey),o=F(e.iv),r=F(e.ciphertext),i=await crypto.subtle.decrypt({name:"AES-GCM",iv:o},n,r);return JSON.parse(new TextDecoder().decode(i))}function B(e){let t="";for(let o=0;o<e.length;o++)t+=String.fromCodePoint(e[o]);let n=btoa(t).replaceAll("+","-").replaceAll("/","_");for(;n.endsWith("=");)n=n.slice(0,-1);return n}function F(e){let t=e.replaceAll("-","+").replaceAll("_","/"),n=atob(t),o=new Uint8Array(n.length);for(let r=0;r<n.length;r++)o[r]=n.codePointAt(r);return o}function be(){let e=Intl.DateTimeFormat().resolvedOptions(),t=Array.isArray(globalThis.navigator.languages)?globalThis.navigator.languages.filter(n=>typeof n=="string"&&n.length>0):void 0;return{origin:globalThis.location.origin,userAgent:globalThis.navigator.userAgent,platform:globalThis.navigator.platform,language:globalThis.navigator.language,...t&&t.length>0?{languages:t}:{},...e.timeZone?{timezone:e.timeZone}:{}}}async function ve(e){let{walletUrl:t,did:n,permissionRequests:o,timeout:r=3e5,appName:i,appIcon:s,portableIdentity:a}=e;if(typeof window>"u")throw new Error("[@enbox/browser] DWeb Connect is only available in browser environments.");let d=new URL("/dweb-connect",t).toString(),l=window.open(d,"enbox-dweb-connect","width=500,height=700,menubar=no,toolbar=no,location=no,status=no");if(!l)throw new Error("[@enbox/browser] Popup blocked. Allow popups for this site to connect to a wallet.");let c,g;try{let f=await z();c=f.keyPair,g=f.publicKeyBase64url}catch{throw l.close(),new Error("[@enbox/browser] DWeb Connect requires a secure context (HTTPS) for encrypted key exchange. crypto.subtle is not available in this environment.")}return new Promise((f,C)=>{let v=!1,y=()=>{v=!0,clearTimeout(M),window.removeEventListener("message",R)},M=setTimeout(()=>{if(!v){y();try{l.close()}catch{}C(new Error("[@enbox/browser] DWeb Connect timed out waiting for wallet response."))}},r),k=setInterval(()=>{l.closed&&!v&&(clearInterval(k),y(),f(void 0))},500),R=h=>{let u=new URL(t).origin;if(h.origin!==u)return;let{type:w}=h.data??{};if(w==="dweb-connect-loaded"){l.postMessage({type:"dweb-connect-authorization-request",did:n,permissions:o,ephemeralPublicKey:g,appName:i,appIcon:s,clientMetadata:be(),portableIdentity:a},u);return}if(w==="dweb-connect-authorization-response"){if(clearInterval(k),y(),h.data.error){f(void 0);return}let p=h.data.encryptedPayload;if(!p){f(void 0);return}oe(p,c).then(b=>{let m=b;if(!m.delegateDid||!m.grants){f(void 0);return}f({delegatePortableDid:m.delegateDid,delegateGrants:m.grants,connectedDid:m.connectedDid??n??m.delegateDid.uri,sessionRevocations:m.sessionRevocations??void 0})}).catch(()=>{f(void 0)})}};window.addEventListener("message",R)})}async function xe(e,t,n=5e3){return typeof window>"u"?!1:new Promise(o=>{let r=document.createElement("iframe");r.style.display="none",r.src=e;let i=!1,s=()=>{i=!0,window.removeEventListener("message",d);try{document.body.removeChild(r)}catch{}},a=setTimeout(()=>{i||(s(),o(!1))},n),d=l=>{let c=new URL(e).origin;if(l.origin!==c)return;let{type:g,supported:f}=l.data??{};g==="dweb-connect-support-response"&&(clearTimeout(a),s(),o(!!f))};window.addEventListener("message",d),r.addEventListener("load",()=>{let l=new URL(e).origin;r.contentWindow?.postMessage({type:"dweb-connect-support-request",did:t},l)}),document.body.appendChild(r)})}var q={initClient:ve,probeWalletSupport:xe};function G(e){if(typeof window>"u"||typeof document>"u")throw new Error("[@enbox/browser] Wallet selector is only available in browser environments.");return new Promise((t,n)=>{let o=document.createElement("div");o.id="enbox-wallet-selector";let r=o.attachShadow({mode:"open"}),i,s=()=>{i!==void 0&&(document.removeEventListener("keydown",i),i=void 0);try{document.body.removeChild(o)}catch{}},a=window.matchMedia?.("(prefers-color-scheme: dark)").matches,d=document.createElement("style");d.textContent=Ce(a),r.appendChild(d);let l=document.createElement("div");l.className="overlay";let c=document.createElement("div");c.className="modal";let g=document.createElement("div");g.className="header";let f=document.createElement("h2");f.textContent="Connect Wallet";let C=document.createElement("button");C.className="close-btn",C.innerHTML="&times;",C.addEventListener("click",()=>{s(),n(new Error("[@enbox/browser] Wallet selection cancelled."))}),g.appendChild(f),g.appendChild(C),c.appendChild(g);let v=document.createElement("div");v.className="wallet-list";for(let p of e){let b=document.createElement("button");b.className="wallet-item";let m=document.createElement("img");m.src=p.icon??Ee(p.url),m.alt=p.name,m.width=32,m.height=32,m.onerror=()=>{m.style.display="none"};let S=document.createElement("div");S.className="wallet-text";let U=document.createElement("span");if(U.className="wallet-name",U.textContent=p.name,S.appendChild(U),p.description){let H=document.createElement("span");H.className="wallet-description",H.textContent=p.description,S.appendChild(H)}let $=document.createElement("span");$.className="arrow",$.textContent="\u203A",b.appendChild(m),b.appendChild(S),b.appendChild($),b.addEventListener("click",()=>{s(),t(p.url)}),v.appendChild(b)}c.appendChild(v);let y=document.createElement("div");y.className="separator";let M=document.createElement("div");M.className="sep-line";let k=document.createElement("span");k.textContent="or";let R=document.createElement("div");R.className="sep-line",y.appendChild(M),y.appendChild(k),y.appendChild(R),c.appendChild(y);let h=document.createElement("div");h.className="input-group";let u=document.createElement("input");u.type="url",u.placeholder="Enter wallet URL...",u.className="url-input";let w=document.createElement("button");w.className="go-btn",w.textContent="Connect",w.disabled=!0,u.addEventListener("input",()=>{w.disabled=!j(u.value)}),u.addEventListener("keydown",p=>{p.key==="Enter"&&j(u.value)&&(s(),t(re(u.value)))}),w.addEventListener("click",()=>{j(u.value)&&(s(),t(re(u.value)))}),h.appendChild(u),h.appendChild(w),c.appendChild(h),l.addEventListener("click",p=>{p.target===l&&(s(),n(new Error("[@enbox/browser] Wallet selection cancelled.")))}),i=p=>{p.key==="Escape"&&(s(),n(new Error("[@enbox/browser] Wallet selection cancelled.")))},document.addEventListener("keydown",i),l.appendChild(c),r.appendChild(l),document.body.appendChild(o),u.focus()})}function Ee(e){return`https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${e}&size=128`}function j(e){try{let t=new URL(e.includes("://")?e:`https://${e}`);return t.protocol==="https:"||t.protocol==="http:"}catch{return!1}}function re(e){return e.includes("://")||(e=`https://${e}`),new URL(e).origin}function Ce(e){let t=e?"#1a1a2e":"#ffffff",n=e?"#e0e0e0":"#1a1a2e",o=e?"#888":"#666",r=e?"#333":"#e0e0e0",i=e?"#16213e":"#f8f9fa",s=e?"#0f3460":"#e9ecef",a=e?"#4a9eff":"#0066cc";return`
154
+ `,f.lastElementChild.addEventListener("click",H),document.body.prepend(f),M=!0)}function he(){M&&(_?.remove(),_=null,f?.remove(),f=null,M=!1)}function H(){document.documentElement.removeAttribute("drl-link-loading"),D=null}var D=null,S=!1,x=null,C=null;function ge(){S||(x=async n=>{let e=n.target?.closest("a");if(e){let t=e.href,o=b(t);if(o){let r=o[0],i=o[1],a=e.target==="_blank";n.preventDefault();try{let s=null;a?(s=window.open("","_blank"),s&&s.document.write(fe)):(D=i,setTimeout(()=>document.documentElement.setAttribute("drl-link-loading",""),50));let u=await oe(r);if(!u.length)throw new Error("no valid DWN endpoints found");let l=`${u[0].replace(L,"")}/${r}/${i}`;a?s&&!s.closed&&(s.location.href=l):D===i&&(window.location.href=l)}catch{throw D===i&&H(),new Error(`DID endpoint resolution failed for the DRL: ${t}`)}}}},C=async n=>{let e=n.composedPath()[0];if(n.pointerType==="mouse"&&n.button===2||n.pointerType==="touch"&&n.isPrimary){if(E(),e?.src&&b(e.src)){h=e,e.__src__=e.src;let t=e.src.replace(te,"https:").replace(L,""),r=await(await re())?.match(t);if(r){let i=r.headers.get("dwn-composed-url");i&&(e.src=i)}e.addEventListener("pointerup",E,{once:!0})}}else e===h&&E()},document.addEventListener("click",x),document.addEventListener("pointercancel",E),document.addEventListener("pointerdown",C),S=!0)}function we(){S&&(x&&(document.removeEventListener("click",x),x=null),C&&(document.removeEventListener("pointerdown",C),C=null),document.removeEventListener("pointercancel",E),E(),H(),S=!1)}var h=null;async function E(n){n?.type==="pointerup"&&await new Promise(e=>requestAnimationFrame(()=>e())),h&&(h.src=h.__src__,delete h.__src__,h=null)}function Ue(n={}){n.didResolvers&&(j=new ee({didResolvers:n.didResolvers})),n.serviceWorker!==!1&&me(n),typeof window<"u"&&typeof window.document<"u"&&(n.injectStyles!==!1&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Z,{once:!0}):Z()),n.links!==!1&&ge())}function Ie(){typeof window<"u"&&typeof window.document<"u"&&(we(),he())}async function $e(){return typeof caches>"u"?!1:caches.delete(ne)}import{assertX25519PublicJwk as Ee,CONNECT_DENIED_TOKEN as ve,ConnectClient as ye}from"@enbox/connect";var F="/dweb-connect",R="enbox-connect-loaded",P="enbox-connect-request",T="enbox-connect-response";function A(n,e,t){if(n.origin!==e||n.source!==t)return;let o=n.data;if(!(typeof o!="object"||o===null))return o}var be=3e5,_e=500,xe="enbox-dweb-connect",Ce="width=500,height=700,menubar=no,toolbar=no,location=no,status=no";function Re(){if(typeof window>"u")throw new Error("[@enbox/browser] DWeb Connect is only available in browser environments.")}var k=class extends Error{constructor(){super("[@enbox/browser] Wallet popup was closed before the wallet finished loading."),this.name="PopupWindowClosedError"}},q=class{constructor(e){this.requiresPin=!1;this._settled=!1;this._walletEpkReceived=!1;Re(),this._walletOrigin=new URL(e.walletUrl).origin,this._timeoutMs=e.timeoutMs??be;let t=new URL(F,e.walletUrl).toString(),o=window.open(t,xe,Ce);if(!o)throw new Error("[@enbox/browser] Popup blocked. Allow popups for this site to connect to a wallet.");this._popup=o,this._walletEpkPromise=new Promise((r,i)=>{this._resolveWalletEpk=r,this._rejectWalletEpk=i}),this._responsePromise=new Promise((r,i)=>{this._resolveResponse=r,this._rejectResponse=i}),this._responsePromise.catch(()=>{}),this._messageListener=r=>{this.onMessage(r)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.fail(new Error("[@enbox/browser] DWeb Connect timed out waiting for wallet response."))},this._timeoutMs),this._closedPollId=setInterval(()=>{this.onClosedPoll()},_e)}async requestProfile(e){return{encryption:{mode:"ecdh-es",walletEpk:await this._walletEpkPromise,walletOrigin:this._walletOrigin},reply:{mode:"post_message"},state:e}}async deliverRequest(e){this._popup.postMessage({type:P,jwe:e},this._walletOrigin)}async awaitResponse(){return await this._responsePromise}onMessage(e){let t=A(e,this._walletOrigin,this._popup);if(t!==void 0){if(t.type===R){this.onLoadedBeacon(t);return}t.type===T&&this.onResponseMessage(t)}}onLoadedBeacon(e){if(this._settled||this._walletEpkReceived)return;let t;try{Ee(e.walletEpk),t=e.walletEpk}catch{this.fail(new Error("[@enbox/browser] Wallet loaded beacon did not carry a valid X25519 public key."));return}if(e.walletOrigin!==this._walletOrigin){this.fail(new Error("[@enbox/browser] Wallet loaded beacon origin does not match the configured wallet origin."));return}this._walletEpkReceived=!0,this._resolveWalletEpk?.(t)}onResponseMessage(e){if(!this._settled){if(typeof e.payload!="string"){this.fail(new Error("[@enbox/browser] Wallet response message did not carry a ciphertext payload."));return}this._settled=!0,this.cleanup(),this._rejectWalletEpk?.(new Error("[@enbox/browser] Wallet responded before the handshake was established.")),this._resolveResponse?.(e.payload)}}onClosedPoll(){if(!(this._settled||this._popup.closed!==!0)){if(!this._walletEpkReceived){this.fail(new k);return}this._settled=!0,this.cleanup(),this._resolveResponse?.(ve)}}fail(e){if(!this._settled){this._settled=!0,this.cleanup();try{this._popup.close()}catch{}this._rejectWalletEpk?.(e),this._rejectResponse?.(e)}}cleanup(){clearTimeout(this._timeoutId),clearInterval(this._closedPollId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0)}};function Pe(){let n=Intl.DateTimeFormat().resolvedOptions(),e=Array.isArray(globalThis.navigator.languages)?globalThis.navigator.languages.filter(t=>typeof t=="string"&&t.length>0):void 0;return{origin:globalThis.location.origin,userAgent:globalThis.navigator.userAgent,platform:globalThis.navigator.platform,language:globalThis.navigator.language,...e&&e.length>0?{languages:e}:{},...n.timeZone?{timezone:n.timeZone}:{}}}async function Y(n){let e=new q({walletUrl:n.walletUrl,timeoutMs:n.timeout}),t=new ye({transport:e});try{return await t.connect({appName:n.appName??globalThis.location.host,appIcon:n.appIcon,clientMetadata:Pe(),permissionRequests:n.permissionRequests})}catch(o){if(o instanceof k)return;throw o}}function G(n){if(typeof window>"u"||typeof document>"u")throw new Error("[@enbox/browser] Wallet selector is only available in browser environments.");return new Promise((e,t)=>{let o=document.createElement("div");o.id="enbox-wallet-selector";let r=o.attachShadow({mode:"open"}),i,a=()=>{i!==void 0&&(document.removeEventListener("keydown",i),i=void 0);try{document.body.removeChild(o)}catch{}},s=window.matchMedia?.("(prefers-color-scheme: dark)").matches,u=document.createElement("style");u.textContent=ke(s),r.appendChild(u);let l=document.createElement("div");l.className="overlay";let c=document.createElement("div");c.className="modal";let v=document.createElement("div");v.className="header";let J=document.createElement("h2");J.textContent="Connect Wallet";let O=document.createElement("button");O.className="close-btn",O.innerHTML="&times;",O.addEventListener("click",()=>{a(),t(new Error("[@enbox/browser] Wallet selection cancelled."))}),v.appendChild(J),v.appendChild(O),c.appendChild(v);let U=document.createElement("div");U.className="wallet-list";for(let d of n){let w=document.createElement("button");w.className="wallet-item";let m=document.createElement("img");m.src=d.icon??Te(d.url),m.alt=d.name,m.width=32,m.height=32,m.onerror=()=>{m.style.display="none"};let N=document.createElement("div");N.className="wallet-text";let I=document.createElement("span");if(I.className="wallet-name",I.textContent=d.name,N.appendChild(I),d.description){let B=document.createElement("span");B.className="wallet-description",B.textContent=d.description,N.appendChild(B)}let $=document.createElement("span");$.className="arrow",$.textContent="\u203A",w.appendChild(m),w.appendChild(N),w.appendChild($),w.addEventListener("click",()=>{a(),e(d.url)}),U.appendChild(w)}c.appendChild(U);let y=document.createElement("div");y.className="separator";let V=document.createElement("div");V.className="sep-line";let Q=document.createElement("span");Q.textContent="or";let X=document.createElement("div");X.className="sep-line",y.appendChild(V),y.appendChild(Q),y.appendChild(X),c.appendChild(y);let W=document.createElement("div");W.className="input-group";let p=document.createElement("input");p.type="url",p.placeholder="Enter wallet URL...",p.className="url-input";let g=document.createElement("button");g.className="go-btn",g.textContent="Connect",g.disabled=!0,p.addEventListener("input",()=>{g.disabled=!z(p.value)}),p.addEventListener("keydown",d=>{d.key==="Enter"&&z(p.value)&&(a(),e(se(p.value)))}),g.addEventListener("click",()=>{z(p.value)&&(a(),e(se(p.value)))}),W.appendChild(p),W.appendChild(g),c.appendChild(W),l.addEventListener("click",d=>{d.target===l&&(a(),t(new Error("[@enbox/browser] Wallet selection cancelled.")))}),i=d=>{d.key==="Escape"&&(a(),t(new Error("[@enbox/browser] Wallet selection cancelled.")))},document.addEventListener("keydown",i),l.appendChild(c),r.appendChild(l),document.body.appendChild(o),p.focus()})}function Te(n){return`https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${n}&size=128`}function z(n){try{let e=new URL(n.includes("://")?n:`https://${n}`);return e.protocol==="https:"||e.protocol==="http:"}catch{return!1}}function se(n){return n.includes("://")||(n=`https://${n}`),new URL(n).origin}function ke(n){let e=n?"#1a1a2e":"#ffffff",t=n?"#e0e0e0":"#1a1a2e",o=n?"#888":"#666",r=n?"#333":"#e0e0e0",i=n?"#16213e":"#f8f9fa",a=n?"#0f3460":"#e9ecef",s=n?"#4a9eff":"#0066cc";return`
155
155
  * { box-sizing: border-box; margin: 0; padding: 0; }
156
156
 
157
157
  .overlay {
@@ -177,8 +177,8 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
177
177
  }
178
178
 
179
179
  .modal {
180
- background: ${t};
181
- color: ${n};
180
+ background: ${e};
181
+ color: ${t};
182
182
  border-radius: 16px;
183
183
  width: 380px;
184
184
  max-width: 90vw;
@@ -211,7 +211,7 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
211
211
  border-radius: 8px;
212
212
  line-height: 1;
213
213
  }
214
- .close-btn:hover { color: ${n}; background: ${i}; }
214
+ .close-btn:hover { color: ${t}; background: ${i}; }
215
215
 
216
216
  .wallet-list {
217
217
  display: flex;
@@ -229,12 +229,12 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
229
229
  border-radius: 12px;
230
230
  cursor: pointer;
231
231
  font-size: 15px;
232
- color: ${n};
232
+ color: ${t};
233
233
  transition: background 0.15s;
234
234
  width: 100%;
235
235
  text-align: left;
236
236
  }
237
- .wallet-item:hover { background: ${s}; }
237
+ .wallet-item:hover { background: ${a}; }
238
238
 
239
239
  .wallet-text {
240
240
  flex: 1;
@@ -282,17 +282,17 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
282
282
  border-radius: 10px;
283
283
  font-size: 14px;
284
284
  background: ${i};
285
- color: ${n};
285
+ color: ${t};
286
286
  outline: none;
287
287
  }
288
- .url-input:focus { border-color: ${a}; }
288
+ .url-input:focus { border-color: ${s}; }
289
289
  .url-input::placeholder { color: ${o}; }
290
290
 
291
291
  .go-btn {
292
292
  padding: 10px 18px;
293
293
  border: none;
294
294
  border-radius: 10px;
295
- background: ${a};
295
+ background: ${s};
296
296
  color: #fff;
297
297
  font-size: 14px;
298
298
  font-weight: 500;
@@ -304,5 +304,5 @@ import{Enbox as Be,defineProtocol as Fe,repository as ze}from"@enbox/api";import
304
304
  cursor: not-allowed;
305
305
  }
306
306
  .go-btn:not(:disabled):hover { filter: brightness(1.1); }
307
- `}var ie=[{name:"Enbox Wallet",url:"https://enbox-wallet.pages.dev",description:"Your digital identity wallet"},{name:"Blue Enbox Wallet",url:"https://blue-enbox-wallet.pages.dev",description:"Your digital identity wallet"}];function Pe(e={}){let{wallets:t=ie,walletUrl:n,timeout:o,appName:r,appIcon:i}=e;return{async requestAccess(s){let a=n;return a||(a=await G(t)),q.initClient({walletUrl:a,permissionRequests:s.permissionRequests,timeout:o,appName:r,appIcon:i})}}}export{je as AuthManager,Ge as AuthSession,Pe as BrowserConnectHandler,ie as DEFAULT_WALLETS,q as DWebConnect,Be as Enbox,Ve as WalletConnect,Le as activatePolyfills,de as cacheResponse,We as clearDrlCache,Ae as deactivatePolyfills,Fe as defineProtocol,we as encryptPostMessagePayload,ce as fetchResource,z as generateEphemeralKeyPair,Q as getDwnEndpoints,le as handleEvent,Ye as normalizeProtocolRequests,D as parseDrlUrl,ze as repository,G as showWalletSelector};
307
+ `}var ae=[{name:"Enbox Wallet",url:"https://enbox-wallet.pages.dev",description:"Your digital identity wallet"},{name:"Blue Enbox Wallet",url:"https://blue-enbox-wallet.pages.dev",description:"Your digital identity wallet"}];function Oe(n={}){let{wallets:e=ae,walletUrl:t,timeout:o,appName:r,appIcon:i}=n;return{async requestAccess(a){let s=t;return s||(s=await G(e)),Y({walletUrl:s,permissionRequests:a.permissionRequests,timeout:o,appName:r,appIcon:i})}}}import{X25519 as We}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as Ne,ConnectProvider as De}from"@enbox/connect";var Le=3e5,K=class n{constructor(e){this._requestReceived=!1;this._dappOrigin=e.dappOrigin,this._dappWindow=e.dappWindow,this._recipientPrivateKey=e.recipientPrivateKey,this._requestPromise=new Promise((t,o)=>{this._resolveRequest=t,this._rejectRequest=o}),this._requestPromise.catch(()=>{}),this._messageListener=t=>{this.onMessage(t)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.close(),this._rejectRequest?.(new Error("[@enbox/browser] Timed out waiting for the connect request from the dapp."))},e.timeoutMs)}static async create(e={}){if(typeof window>"u")throw new Error("[@enbox/browser] WalletPostMessageTransport is only available in browser environments.");let t=e.dappWindow??window.opener;if(!t)throw new Error("[@enbox/browser] No opener window: the DWeb Connect page must be opened as a popup by the dapp.");let o=Me(e.dappOrigin),r=await We.generateKey(),i={kty:"OKP",crv:"X25519",x:r.x},a=new n({dappOrigin:o,dappWindow:t,recipientPrivateKey:r,timeoutMs:e.timeoutMs??Le});return t.postMessage({type:R,walletEpk:i,walletOrigin:globalThis.location.origin},o),a}get dappOrigin(){return this._dappOrigin}async awaitRequest(){return await this._requestPromise}sendResponse(e){this._dappWindow.postMessage({type:T,payload:e},this._dappOrigin),this.close()}deny(){this.sendResponse(Ne)}close(){clearTimeout(this._timeoutId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0)}onMessage(e){let t=A(e,this._dappOrigin,this._dappWindow);if(t!==void 0&&!(t.type!==P||this._requestReceived)){if(this._requestReceived=!0,typeof t.jwe!="string"){this.settleRequest(new Error("[@enbox/browser] Connect request message did not carry a ciphertext payload."));return}this.openRequest(t.jwe)}}async openRequest(e){try{let t=await De.openRequest({jwe:e,decryption:{mode:"ecdh-es",recipientPrivateKey:this._recipientPrivateKey,walletOrigin:globalThis.location.origin}});if(t.reply.mode!=="post_message"){this.settleRequest(new Error("[@enbox/browser] Connect request over the popup channel must use the `post_message` reply mode."));return}this.settleRequest(t)}catch(t){this.settleRequest(t instanceof Error?t:new Error(String(t)))}}settleRequest(e){if(clearTimeout(this._timeoutId),e instanceof Error){this.close(),this._rejectRequest?.(e);return}this._resolveRequest?.(e)}};function Me(n){if(n!==void 0)return new URL(n).origin;if(document.referrer)return new URL(document.referrer).origin;throw new Error("[@enbox/browser] Unable to determine the dapp origin: no `dappOrigin` option was provided and `document.referrer` is empty.")}export{at as AuthManager,lt as AuthSession,Oe as BrowserConnectHandler,ut as CONNECT_DENIED_TOKEN,mt as ConnectProvider,ae as DEFAULT_WALLETS,R as DWEB_CONNECT_LOADED_MESSAGE_TYPE,F as DWEB_CONNECT_PATH,P as DWEB_CONNECT_REQUEST_MESSAGE_TYPE,T as DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,ot as Enbox,q as PopupClientTransport,k as PopupWindowClosedError,ct as WalletConnect,K as WalletPostMessageTransport,Ue as activatePolyfills,ue as cacheResponse,$e as clearDrlCache,Y as connectViaPopup,Ie as deactivatePolyfills,rt as defineProtocol,pe as fetchResource,oe as getDwnEndpoints,ce as handleEvent,dt as normalizeProtocolRequests,b as parseDrlUrl,it as repository,G as showWalletSelector};
308
308
  //# sourceMappingURL=browser.mjs.map