@enbox/browser 0.3.83 → 0.3.85
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/README.md +29 -25
- package/dist/browser.mjs +161 -161
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/application.js +37 -0
- package/dist/esm/application.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web-features.js +3 -2
- package/dist/esm/web-features.js.map +1 -1
- package/dist/types/application.d.ts +26 -0
- package/dist/types/application.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/web-features.d.ts +2 -0
- package/dist/types/web-features.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/application.ts +69 -0
- package/src/index.ts +2 -0
- package/src/web-features.ts +3 -2
package/dist/browser.mjs
CHANGED
|
@@ -1,157 +1,4 @@
|
|
|
1
|
-
export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_TOKEN as Fo,ConnectProvider as zo}from"@enbox/connect";import{createDidDhtMethod as Cn,DidDht as Rt,DidResolverCacheMemory as kt,DidWeb as Tt,resolveDwnEndpointStatus as _n,UniversalResolver as Dt}from"@enbox/dids";function se(t){let e=t.indexOf("://dweb/");if(e===-1)return null;let n=t.slice(0,e);if(n!=="http"&&n!=="https")return null;let r=t.slice(e+8);if(r.length===0)return null;let o=r.indexOf("/");return o===-1?[r,""]:o===0?null:[r.slice(0,o),r.slice(o+1)]}var je=new Dt({didResolvers:[Rt,Tt],cache:new kt});function Pn({didDhtNetwork:t,didResolvers:e}){if(e!==void 0&&t!==void 0)throw new Error("activatePolyfills: didDhtNetwork cannot be combined with didResolvers. Configure the resolver list directly.");if(e===void 0&&t===void 0)return;let n=t===void 0?Rt:Cn(t);je=new Dt({didResolvers:e??[n,Tt],cache:new kt})}var St=/^http:/,ke=/\/$/,Mt="drl";async function Lt(t){let e=await _n(t,je);return e.status==="ready"?e.endpoints:[]}async function At(){if(!(typeof caches>"u"))return caches.open(Mt)}async function Rn(t,e,n,r){let o=t.request.url.replace(St,"https:").replace(ke,""),i=await At(),s=await i?.match(o);if(s){if(!navigator.onLine)return s;let a=await r?.onCacheCheck?.(t,o);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 kn(t,e,o,n,i,r);{let a=await je.resolve(e);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 kn(t,e,n,r,o,i){let s=await Lt(e);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 p=`${d.replace(ke,"")}/${e}/${r}`,g=await fetch(p,{headers:t.request.headers});if(g.ok)return await i?.onCacheCheck?.(t,n)&&o&&Tn(n,p,g,o),g;console.log(`DWN endpoint error: ${g.status}`),a=new Response("DWeb Node request failed",{status:g.status})}catch(p){console.log(`DWN endpoint error: ${p}`),a=new Response("DWeb Node request failed",{status:500})}return a}async function Tn(t,e,n,r){try{let o=n.clone(),i=new Headers(o.headers);i.append("dwn-cache-time",Date.now().toString()),i.append("dwn-composed-url",e);let s=new Response(o.body,{headers:i});await r.put(t,s)}catch(o){console.log(`Failed to cache DRL response: ${o}`)}}async function Dn(t={}){try{if(typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope){let e=self;e.skipWaiting(),e.addEventListener("activate",n=>{n.waitUntil(e.clients.claim())}),e.addEventListener("fetch",n=>{let r=se(n.request.url);r&&n.respondWith(Rn(n,r[0],r[1],t))})}else if(globalThis?.navigator?.serviceWorker){if(!await navigator.serviceWorker.getRegistration("/")){let n=t.path||document?.currentScript?.src||import.meta.url;n&&navigator.serviceWorker.register(n,{type:"module"}).catch(r=>{console.error("DWeb networking feature installation failed: ",r)})}}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 Ot=`
|
|
2
|
-
.drl-loading-overlay {
|
|
3
|
-
position: fixed;
|
|
4
|
-
inset: 0;
|
|
5
|
-
display: flex;
|
|
6
|
-
flex-wrap: wrap;
|
|
7
|
-
flex-direction: column;
|
|
8
|
-
align-items: center;
|
|
9
|
-
justify-content: center;
|
|
10
|
-
font-size: 22px;
|
|
11
|
-
color: #fff;
|
|
12
|
-
background: rgba(0, 0, 0, 0.75);
|
|
13
|
-
backdrop-filter: blur(15px);
|
|
14
|
-
-webkit-backdrop-filter: blur(15px);
|
|
15
|
-
z-index: 1000000;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.drl-loading-overlay > div {
|
|
19
|
-
display: flex;
|
|
20
|
-
align-items: center;
|
|
21
|
-
justify-content: center;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
.drl-loading-spinner {
|
|
25
|
-
display: flex;
|
|
26
|
-
align-items: center;
|
|
27
|
-
justify-content: center;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
.drl-loading-spinner div {
|
|
31
|
-
position: relative;
|
|
32
|
-
width: 2em;
|
|
33
|
-
height: 2em;
|
|
34
|
-
margin: 0.1em 0.25em 0 0;
|
|
35
|
-
}
|
|
36
|
-
.drl-loading-spinner div::after,
|
|
37
|
-
.drl-loading-spinner div::before {
|
|
38
|
-
content: '';
|
|
39
|
-
box-sizing: border-box;
|
|
40
|
-
width: 100%;
|
|
41
|
-
height: 100%;
|
|
42
|
-
border-radius: 50%;
|
|
43
|
-
border: 0.1em solid #FFF;
|
|
44
|
-
position: absolute;
|
|
45
|
-
left: 0;
|
|
46
|
-
top: 0;
|
|
47
|
-
opacity: 0;
|
|
48
|
-
animation: drl-loading-spinner 2s linear infinite;
|
|
49
|
-
}
|
|
50
|
-
.drl-loading-spinner div::after {
|
|
51
|
-
animation-delay: 1s;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
.drl-loading-overlay span {
|
|
55
|
-
--text-opacity: 2;
|
|
56
|
-
display: flex;
|
|
57
|
-
align-items: center;
|
|
58
|
-
margin: 2em auto 0;
|
|
59
|
-
padding: 0.2em 0.75em 0.25em;
|
|
60
|
-
text-align: center;
|
|
61
|
-
border-radius: 5em;
|
|
62
|
-
background: rgba(255 255 255 / 8%);
|
|
63
|
-
opacity: 0.8;
|
|
64
|
-
transition: opacity 0.3s ease;
|
|
65
|
-
cursor: pointer;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.drl-loading-overlay span:focus {
|
|
69
|
-
opacity: 1;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
.drl-loading-overlay span:hover {
|
|
73
|
-
opacity: 1;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.drl-loading-overlay span::before {
|
|
77
|
-
content: '\u2715 ';
|
|
78
|
-
margin: 0 0.4em 0 0;
|
|
79
|
-
color: red;
|
|
80
|
-
font-size: 65%;
|
|
81
|
-
font-weight: bold;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.drl-loading-overlay span::after {
|
|
85
|
-
content: 'stop';
|
|
86
|
-
display: block;
|
|
87
|
-
font-size: 60%;
|
|
88
|
-
line-height: 0;
|
|
89
|
-
color: rgba(255 255 255 / 60%);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
.drl-loading-overlay.new-tab-overlay span::after {
|
|
93
|
-
content: 'close';
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
@keyframes drl-loading-spinner {
|
|
97
|
-
0% {
|
|
98
|
-
transform: scale(0);
|
|
99
|
-
opacity: 1;
|
|
100
|
-
}
|
|
101
|
-
100% {
|
|
102
|
-
transform: scale(1);
|
|
103
|
-
opacity: 0;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
`,Sn=`
|
|
107
|
-
<!DOCTYPE html>
|
|
108
|
-
<html lang='en'>
|
|
109
|
-
<head>
|
|
110
|
-
<meta charset='UTF-8'>
|
|
111
|
-
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
|
|
112
|
-
<title>Loading DRL...</title>
|
|
113
|
-
<style>
|
|
114
|
-
html, body {
|
|
115
|
-
background-color: #151518;
|
|
116
|
-
height: 100%;
|
|
117
|
-
margin: 0;
|
|
118
|
-
padding: 0;
|
|
119
|
-
font-family: Arial, sans-serif;
|
|
120
|
-
text-align: center;
|
|
121
|
-
}
|
|
122
|
-
${Ot}
|
|
123
|
-
</style>
|
|
124
|
-
</head>
|
|
125
|
-
<body>
|
|
126
|
-
<div class='drl-loading-overlay new-tab-overlay'>
|
|
127
|
-
<div class='drl-loading-spinner'>
|
|
128
|
-
<div></div>
|
|
129
|
-
Loading DRL
|
|
130
|
-
</div>
|
|
131
|
-
<span onclick='window.close()' tabindex='0'></span>
|
|
132
|
-
</div>
|
|
133
|
-
</body>
|
|
134
|
-
</html>
|
|
135
|
-
`,_e=!1,j=null,ae=null;function Pt(){_e||(ae=document.createElement("style"),ae.innerHTML=`
|
|
136
|
-
${Ot}
|
|
137
|
-
|
|
138
|
-
.drl-loading-overlay {
|
|
139
|
-
opacity: 0;
|
|
140
|
-
transition: opacity 0.3s ease;
|
|
141
|
-
pointer-events: none;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
:root[drl-link-loading] .drl-loading-overlay {
|
|
145
|
-
opacity: 1;
|
|
146
|
-
pointer-events: all;
|
|
147
|
-
}
|
|
148
|
-
`,document.head.append(ae),j=document.createElement("div"),j.classList.add("drl-loading-overlay"),j.innerHTML=`
|
|
149
|
-
<div class='drl-loading-spinner'>
|
|
150
|
-
<div></div>
|
|
151
|
-
Loading DRL
|
|
152
|
-
</div>
|
|
153
|
-
<span tabindex='0'></span>
|
|
154
|
-
`,j.lastElementChild.addEventListener("click",He),document.body.prepend(j),_e=!0)}function Mn(){_e&&(ae?.remove(),ae=null,j?.remove(),j=null,_e=!1)}function He(){document.documentElement.removeAttribute("drl-link-loading"),Pe=null}async function Ln(t,e,n){let r=null;n?(r=window.open("","_blank"),r&&r.document.write(Sn)):(Pe=e,setTimeout(()=>document.documentElement.setAttribute("drl-link-loading",""),50));let o=await Lt(t);if(!o.length)throw new Error("no valid DWN endpoints found");let i=`${o[0].replace(ke,"")}/${t}/${e}`;n?r&&!r.closed&&(r.location.href=i):Pe===e&&(window.location.href=i)}var Pe=null,Re=!1,le=null,ce=null;function An(){Re||(le=async t=>{let e=t.target?.closest("a");if(!e)return;let n=e.href,r=se(n);if(!r)return;let o=r[0],i=r[1],s=e.target==="_blank";t.preventDefault();try{await Ln(o,i,s)}catch{throw Pe===i&&He(),new Error(`DID endpoint resolution failed for the DRL: ${n}`)}},ce=async t=>{let e=t.composedPath()[0];if(t.pointerType==="mouse"&&t.button===2||t.pointerType==="touch"&&t.isPrimary){if(G(),e?.src&&se(e.src)){H=e,e.__src__=e.src;let n=e.src.replace(St,"https:").replace(ke,""),o=await(await At())?.match(n);if(o){let i=o.headers.get("dwn-composed-url");i&&(e.src=i)}e.addEventListener("pointerup",G,{once:!0})}}else e===H&&G()},document.addEventListener("click",le),document.addEventListener("pointercancel",G),document.addEventListener("pointerdown",ce),Re=!0)}function On(){Re&&(le&&(document.removeEventListener("click",le),le=null),ce&&(document.removeEventListener("pointerdown",ce),ce=null),document.removeEventListener("pointercancel",G),G(),He(),Re=!1)}var H=null;async function G(t){t?.type==="pointerup"&&await new Promise(e=>requestAnimationFrame(()=>e())),H&&(H.src=H.__src__,delete H.__src__,H=null)}function Ut(t={}){Pn(t),t.serviceWorker!==!1&&Dn(t),typeof window<"u"&&typeof window.document<"u"&&(t.injectStyles!==!1&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Pt,{once:!0}):Pt()),t.links!==!1&&An())}function no(){typeof window<"u"&&typeof window.document<"u"&&(On(),Mn())}async function ro(){return typeof caches>"u"?!1:caches.delete(Mt)}async function Un(t,e={}){let{signal:n,timeoutMs:r=2e4}=e;if(n?.throwIfAborted(),!Number.isFinite(r)||r<0||r>2147483647)throw new RangeError("prepareBrowser: timeoutMs must be between 0 and 2147483647 milliseconds.");if(typeof window>"u"||!("serviceWorker"in navigator))throw new Error("prepareBrowser: service workers are unavailable in this page.");let o=navigator.serviceWorker,i=typeof t=="string"||"href"in t?new URL(t,document.baseURI):void 0;i!==void 0&&(i.hash="");let s=await new Promise((a,d)=>{let p,g=!1,x=()=>{g=!0,clearTimeout(w),o.removeEventListener("controllerchange",R),n?.removeEventListener("abort",u)},C=E=>{g||(x(),d(E))},R=()=>{let E=o.controller;g||p===void 0||E===null||E!==p.active||i!==void 0&&E.scriptURL!==i.href||(x(),a(p))},u=()=>C(n?.reason),w=setTimeout(()=>{C(new DOMException("The application service worker did not take control before the timeout.","TimeoutError"))},r);o.addEventListener("controllerchange",R),n?.addEventListener("abort",u,{once:!0});try{n?.throwIfAborted(),i===void 0?(p=t,R()):o.register(i.href,e.registrationOptions).then(E=>{g||(p=E,R())},C)}catch(E){C(E)}});return n?.throwIfAborted(),Ut({...e.polyfills,serviceWorker:!1}),s}import{ConnectClient as Er}from"@enbox/connect";function de(t){let e=document.createElement("span");e.className="wallet-icon";let n=document.createElement("span");n.className="wallet-badge",n.textContent=t.name.charAt(0).toUpperCase(),e.appendChild(n);let r=Wn(t);if(r.length===0)return e;let o=document.createElement("img");o.className="wallet-img",o.alt="",o.width=28,o.height=28;let i=0;return o.addEventListener("error",()=>{i+=1,i<r.length?o.src=r[i]:o.remove()}),o.src=r[i],e.appendChild(o),e}function Wn(t){if(t.icon!==void 0)return[t.icon];let e;try{e=new URL(t.url).origin}catch{return[]}return[`${e}/favicon.svg`,`${e}/favicon.ico`,`${e}/favicon.png`]}import{assertX25519PublicJwk as qn,CONNECT_DENIED_TOKEN as Nn,ConnectClient as In}from"@enbox/connect";function Te(){let t,e,n=new Promise((r,o)=>{t=r,e=o});return n.catch(()=>{}),{promise:n,resolve:t,reject:e}}var $e="/dweb-connect",pe="enbox-connect-loaded",ue="enbox-connect-request",fe="enbox-connect-response",me="enbox-connect-ack";function De(t,e,n){if(t.origin!==e||t.source!==n)return;let r=t.data;if(!(typeof r!="object"||r===null))return r}var Bn=3e5,jn=500,Hn=1500,$n="enbox-dweb-connect",Wt=500,qt=700;function Kn(){let t=`width=${Wt},height=${qt},menubar=no,toolbar=no,location=no,status=no`,e=window.outerWidth>0?window.outerWidth:window.screen?.availWidth??0,n=window.outerHeight>0?window.outerHeight:window.screen?.availHeight??0;if(e===0||n===0)return t;let r=Math.max(0,Math.round((window.screenX??0)+(e-Wt)/2)),o=Math.max(0,Math.round((window.screenY??0)+(n-qt)/2));return`${t},left=${r},top=${o}`}function Fn(){if(typeof window>"u")throw new TypeError("[@enbox/browser] DWeb Connect is only available in browser environments.")}var $=class extends Error{constructor(){super("[@enbox/browser] Wallet popup was closed before the wallet finished loading."),this.name="PopupWindowClosedError"}},J=class{constructor(e){this.requiresPin=!1;this._settled=!1;this._walletEpkReceived=!1;Fn(),this._walletOrigin=new URL(e.walletUrl).origin,this._timeoutMs=e.timeoutMs??Bn;let n=new URL($e,e.walletUrl).toString(),r=window.open(n,$n,Kn());if(!r)throw new Error("[@enbox/browser] Popup blocked. Allow popups for this site to connect to a wallet.");this._popup=r,this._walletEpkPromise=new Promise((i,s)=>{this._resolveWalletEpk=i,this._rejectWalletEpk=s});let o=Te();this._responsePromise=o.promise,this._resolveResponse=o.resolve,this._rejectResponse=o.reject,this._messageListener=i=>{this.onMessage(i)},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()},jn)}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:ue,jwe:e},this._walletOrigin)}async awaitResponse(){return await this._responsePromise}async confirmComplete(){this._popup.closed!==!0&&this._popup.postMessage({type:me},this._walletOrigin)}onMessage(e){let n=De(e,this._walletOrigin,this._popup);if(n!==void 0){if(n.type===pe){this.onLoadedBeacon(n);return}n.type===fe&&this.onResponseMessage(n)}}onLoadedBeacon(e){if(this._settled||this._walletEpkReceived)return;let n;try{qn(e.walletEpk),n=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?.(n)}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 $);return}clearInterval(this._closedPollId),setTimeout(()=>{this._settled||(this._settled=!0,this.cleanup(),this._resolveResponse(Nn))},Hn)}}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 Se(){let t=Intl.DateTimeFormat().resolvedOptions(),e=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,...e&&e.length>0?{languages:e}:{},...t.timeZone?{timezone:t.timeZone}:{}}}async function zn(t){let e=new J({walletUrl:t.walletUrl,timeoutMs:t.timeout}),n=new In({transport:e});try{return await n.connect({appName:t.appName??globalThis.location.host,appIcon:t.appIcon,clientMetadata:Se(),permissionRequests:t.permissionRequests})}catch(r){if(r instanceof $)return;throw r}}var It=[-1,10,16,26,18,24,16,18,22,22,26],Bt=[-1,1,1,1,2,2,4,4,4,5,5],jt=[-1,26,44,70,100,134,172,196,242,292,346],Yn=0,Ht=10;function $t(t){return jt[t]-It[t]*Bt[t]}function Ge(t,e){let n=new TextEncoder().encode(t),r=Gn(n.length);if(r===0)throw new Error(`[@enbox/browser] QR payload too long (${n.length} bytes exceeds version ${Ht}-M capacity).`);let o=Jn(n,r),i=Xn(o,r),s=17+4*r,a=Array.from({length:s},()=>new Array(s).fill(!1)),d=Array.from({length:s},()=>new Array(s).fill(!1));tr(a,d,r),or(a,d,i);let p=e??-1;return p===-1&&(p=Qn(a,d)),Ye(a,d,p),Je(a,d,p),{size:s,modules:a,version:r,mask:p}}function Gn(t){for(let e=1;e<=Ht;e++){let n=$t(e)*8;if(4+(e<=9?8:16)+t*8<=n)return e}return 0}function Jn(t,e){let n=[],r=(d,p)=>{for(let g=p-1;g>=0;g--)n.push(d>>>g&1)};r(4,4),r(t.length,e<=9?8:16);for(let d of t)r(d,8);let o=$t(e)*8;r(0,Math.min(4,o-n.length)),r(0,(8-n.length%8)%8);let i=[236,17],s=0;for(;n.length<o;)r(i[s],8),s^=1;let a=new Uint8Array(o/8);for(let d=0;d<n.length;d++)a[d>>3]|=n[d]<<7-(d&7);return a}function Qn(t,e){let n=0,r=1/0;for(let o=0;o<8;o++){Ye(t,e,o),Je(t,e,o);let i=pr(t);i<r&&(r=i,n=o),Ye(t,e,o)}return n}function Xn(t,e){let n=Bt[e],r=It[e],o=jt[e],i=n-o%n,s=Math.floor(o/n),a=[],d=[],p=Vn(r),g=0;for(let u=0;u<n;u++){let w=s-r+(u<i?0:1),E=t.slice(g,g+w);g+=w,a.push(E),d.push(Zn(E,p))}let x=new Uint8Array(o),C=0,R=s-r+1;for(let u=0;u<R;u++)for(let w=0;w<n;w++)u<a[w].length&&(x[C++]=a[w][u]);for(let u=0;u<r;u++)for(let w=0;w<n;w++)x[C++]=d[w][u];return x}function ze(t,e){let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(e>>>r&1)*t;return n&255}function Vn(t){let e=new Uint8Array(t);e[t-1]=1;let n=1;for(let r=0;r<t;r++){for(let o=0;o<t;o++)e[o]=ze(e[o],n),o+1<t&&(e[o]^=e[o+1]);n=ze(n,2)}return e}function Zn(t,e){let n=new Uint8Array(e.length);for(let r of t){let o=r^n[0];n.copyWithin(0,1),n[n.length-1]=0;for(let i=0;i<e.length;i++)n[i]^=ze(e[i],o)}return n}var er=[[],[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50]];function P(t,e,n,r,o){t[r][n]=o,e[r][n]=!0}function tr(t,e,n){let r=t.length;for(let i=0;i<r;i++)P(t,e,6,i,i%2===0),P(t,e,i,6,i%2===0);Ke(t,e,3,3),Ke(t,e,r-4,3),Ke(t,e,3,r-4);let o=er[n];for(let i=0;i<o.length;i++)for(let s=0;s<o.length;s++)i===0&&s===0||i===0&&s===o.length-1||i===o.length-1&&s===0||nr(t,e,o[i],o[s]);Je(t,e,0),P(t,e,8,r-8,!0),n>=7&&rr(t,e,n)}function Ke(t,e,n,r){let o=t.length;for(let i=-4;i<=4;i++)for(let s=-4;s<=4;s++){let a=n+s,d=r+i;if(a<0||a>=o||d<0||d>=o)continue;let p=Math.max(Math.abs(s),Math.abs(i));P(t,e,a,d,p!==2&&p!==4)}}function nr(t,e,n,r){for(let o=-2;o<=2;o++)for(let i=-2;i<=2;i++)P(t,e,n+i,r+o,Math.max(Math.abs(i),Math.abs(o))!==1)}function Je(t,e,n){let r=t.length,o=Yn<<3|n,i=o;for(let a=0;a<10;a++)i=i<<1^(i>>>9)*1335;let s=(o<<10|i)^21522;for(let a=0;a<=5;a++)P(t,e,8,a,(s>>>a&1)!==0);P(t,e,8,7,(s>>>6&1)!==0),P(t,e,8,8,(s>>>7&1)!==0),P(t,e,7,8,(s>>>8&1)!==0);for(let a=9;a<15;a++)P(t,e,14-a,8,(s>>>a&1)!==0);for(let a=0;a<8;a++)P(t,e,r-1-a,8,(s>>>a&1)!==0);for(let a=8;a<15;a++)P(t,e,8,r-15+a,(s>>>a&1)!==0)}function rr(t,e,n){let r=t.length,o=n;for(let s=0;s<12;s++)o=o<<1^(o>>>11)*7973;let i=n<<12|o;for(let s=0;s<18;s++){let a=(i>>>s&1)!==0,d=r-11+s%3,p=Math.floor(s/3);P(t,e,d,p,a),P(t,e,p,d,a)}}function or(t,e,n){let r=t.length,o=0;for(let i=r-1;i>=1;i-=2){let s=i<=6?i-1:i;o=ir(t,e,n,s,r,o)}}function ir(t,e,n,r,o,i){for(let s=0;s<o;s++)for(let a=0;a<2;a++){let{x:d,y:p}=sr(r,s,a,o);!e[p][d]&&i<n.length*8&&(t[p][d]=(n[i>>3]>>>7-(i&7)&1)!==0,i++)}return i}function sr(t,e,n,r){let o=t-n,s=(t+1&2)===0?r-1-e:e;return{x:o,y:s}}function Ye(t,e,n){let r=t.length;for(let o=0;o<r;o++)for(let i=0;i<r;i++){if(e[o][i])continue;let s;switch(n){case 0:s=(i+o)%2===0;break;case 1:s=o%2===0;break;case 2:s=i%3===0;break;case 3:s=(i+o)%3===0;break;case 4:s=(Math.floor(i/3)+Math.floor(o/2))%2===0;break;case 5:s=i*o%2+i*o%3===0;break;case 6:s=(i*o%2+i*o%3)%2===0;break;default:s=((i+o)%2+i*o%3)%2===0;break}s&&(t[o][i]=!t[o][i])}}function ar(t,e){let n=0;for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[r][s]!==o?(o=t[r][s],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[s][r]!==o?(o=t[s][r],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}return n}function lr(t,e){let n=0;for(let r=0;r<e-1;r++)for(let o=0;o<e-1;o++){let i=t[r][o];i===t[r][o+1]&&i===t[r+1][o]&&i===t[r+1][o+1]&&(n+=3)}return n}function Nt(t,e){if(![!0,!1,!0,!0,!0,!1,!0].every((s,a)=>t[e+a]===s))return 0;let o=e>=4&&t.slice(e-4,e).every(s=>!s),i=e+11<=t.length&&t.slice(e+7,e+11).every(s=>!s);return(o?40:0)+(i?40:0)}function cr(t,e){let n=0;for(let r=0;r<e;r++){let o=t[r],i=t.map(s=>s[r]);for(let s=0;s+7<=e;s++)n+=Nt(o,s),n+=Nt(i,s)}return n}function dr(t,e){let n=0;for(let i of t)for(let s of i)s&&n++;let r=e*e;return(Math.ceil(Math.abs(n*20-r*10)/r)-1)*10}function pr(t){let e=t.length,n=0;return n+=ar(t,e),n+=lr(t,e),n+=cr(t,e),n+=dr(t,e),n}var Fe="http://www.w3.org/2000/svg";function Qe(t,e={}){let n=e.dark??"#000000",r=e.light??"#ffffff",o=e.quietZone??2,i=t.size+o*2,s="";for(let g=0;g<t.size;g++)for(let x=0;x<t.size;x++)t.modules[g][x]&&(s+=`M${x+o} ${g+o}h1v1h-1z`);let a=document.createElementNS(Fe,"svg");a.setAttribute("viewBox",`0 0 ${i} ${i}`),a.setAttribute("shape-rendering","crispEdges"),a.setAttribute("role","img");let d=document.createElementNS(Fe,"rect");d.setAttribute("width",String(i)),d.setAttribute("height",String(i)),d.setAttribute("fill",r),a.appendChild(d);let p=document.createElementNS(Fe,"path");return p.setAttribute("d",s),p.setAttribute("fill",n),a.appendChild(p),a}var Kt="/.well-known/enbox-connect";async function Me(t){try{let e=new URL(Kt,t).toString(),n=await fetch(e,{signal:AbortSignal.timeout(6e3)});if(!n.ok)return;let r=await n.json();return typeof r?.connectServerUrl!="string"?void 0:{connectServerUrl:r.connectServerUrl}}catch{return}}async function Xe(t){return await Me(t)!==void 0}import{DidJwk as ur}from"@enbox/dids";import{X25519 as fr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as mr,openResponse as hr,randomToken as Ft,RelayClientTransport as gr,resolveDelegatePortableDid as vr,sealRequest as br}from"@enbox/connect";var Ve=6,Q=class extends Error{constructor(){super("[@enbox/browser] Relay connect cancelled."),this.name="RelayConnectCancelledError"}};function wr(t){return new Promise(e=>{if(typeof document>"u"){setTimeout(e,t);return}let n=()=>{clearTimeout(o),document.removeEventListener("visibilitychange",r),e()},r=()=>{document.visibilityState==="visible"&&n()},o=setTimeout(n,t);document.addEventListener("visibilitychange",r)})}async function Ze(t){if(t.requestType==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e=t.createTransport??(E=>new gr({...E,sleep:wr})),n=t.cancelled===void 0?void 0:new AbortController,r=e({connectServerUrl:t.connectServerUrl,walletUri:t.walletUri,timeoutMs:t.timeoutMs,pollIntervalMs:t.pollIntervalMs,onClaimed:t.onClaimed,signal:n?.signal}),o=await ur.create(),i=await fr.generateKey(),s={kty:"OKP",crv:"X25519",x:i.x},a=Ft(),d=Ft(),p=await r.requestProfile(d),g={clientDid:o.uri,appName:t.appName,appIcon:t.appIcon,applicationId:t.applicationId,clientMetadata:t.clientMetadata,permissionRequests:t.permissionRequests,delegateDid:t.delegatePortableDid?.uri,requestType:t.requestType,expectedProviderDid:t.expectedProviderDid,supportedDidMethods:["did:dht","did:jwk"],nonce:a,state:d,responseKey:s,reply:p.reply},x=await br({request:g,signer:o,encryption:p.encryption}),C=await r.deliverRequest(x);C!==void 0&&t.onWalletUriReady(C);let R=t.cancelled===void 0?r.awaitResponse():Promise.race([r.awaitResponse(),t.cancelled]),u;try{u=await R}catch(E){throw n?.abort(),E}if(u===mr)return;let w;for(let E=1;E<=Ve;E++){let he=await(t.cancelled===void 0?t.requestPin(E,w):Promise.race([t.requestPin(E,w),t.cancelled])),O=await yr({responseCiphertext:u,responsePrivateKey:i,clientDid:o.uri,nonce:a,state:d,pin:he,expectedProviderDid:t.expectedProviderDid,delegatePortableDid:t.delegatePortableDid,confirmComplete:r.confirmComplete?.bind(r)});if(O.matched)return O.result;w=O.error}throw new Error(`[@enbox/browser] The pairing code did not match after ${Ve} attempts.`)}async function yr(t){try{let e=await hr({jwe:t.responseCiphertext,recipientPrivateKey:t.responsePrivateKey,expected:{clientDid:t.clientDid,nonce:t.nonce,state:t.state,providerDid:t.expectedProviderDid},pin:t.pin}),n=vr({localDelegatePortableDid:t.delegatePortableDid,response:e});return t.confirmComplete?.().catch(()=>{}),{matched:!0,result:{delegatePortableDid:n,delegateGrants:e.delegateGrants,connectedDid:e.providerDid,sessionRevocations:e.sessionRevocations}}}catch(e){let n=e instanceof Error?e:new Error(String(e));if(n.message.startsWith("Connect:"))throw n;return{matched:!1,error:n}}}var Qt="enbox:connect:lastChoice",Ae="enbox:connect:sessionChoices",Xt=20,xr=12e4,Cr=1e4,Le=4,_r=4,zt=3,et={background:"--ec-bg",surface:"--ec-surface",text:"--ec-text",textMuted:"--ec-muted",border:"--ec-border",accent:"--ec-accent",accentContrast:"--ec-accent-contrast",danger:"--ec-danger",success:"--ec-success"};async function Vt(t){return(await Me(t))?.connectServerUrl}async function Pr(t){let e=new J({walletUrl:t.walletUrl,timeoutMs:t.timeoutMs});return await new Er({transport:e}).connect({appName:t.appName,appIcon:t.appIcon,applicationId:t.applicationId,clientMetadata:Se(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.requestType,expectedProviderDid:t.expectedProviderDid})}function Rr(){return typeof window>"u"?!1:(window.matchMedia?.("(pointer: coarse)").matches??!1)&&Math.min(window.innerWidth,window.innerHeight)<900}function kr(){return{runRelay:Ze,runPopup:Pr,discoverConnectServerUrl:Vt,validateWalletUrl:Xe,isMobile:Rr,storage:typeof localStorage>"u"?void 0:localStorage}}function Tr(t){try{let e=t?.getItem(Qt);if(e==null)return;let n=JSON.parse(e);if((n.method==="phone"||n.method==="browser")&&Zt(n.walletUrl))return{method:n.method,walletUrl:n.walletUrl}}catch{}}function Dr(t,e){try{t?.setItem(Qt,JSON.stringify(e))}catch{}}function Sr(t){if(typeof t!="object"||t===null)return!1;let e=t;return(e.method==="phone"||e.method==="browser")&&Zt(e.walletUrl)&&typeof e.delegateDid=="string"&&e.delegateDid.length>0&&typeof e.providerDid=="string"&&e.providerDid.length>0}function nt(t){try{let e=t?.getItem(Ae);if(e==null)return[];let n=JSON.parse(e);return Array.isArray(n)?n.filter(Sr).slice(-Xt):[]}catch{return[]}}function Mr(t,e,n){if(e===void 0)return;let r=nt(t);for(let o=r.length-1;o>=0;o--){let i=r[o];if(i.delegateDid===e&&(n===void 0||i.providerDid===n))return i}}function Lr(t,e){try{let n=nt(t).filter(r=>r.delegateDid!==e.delegateDid||r.providerDid!==e.providerDid);n.push(e),t?.setItem(Ae,JSON.stringify(n.slice(-Xt)))}catch{}}function Ar(t,e,n){try{let r=nt(t).filter(o=>o.delegateDid!==e||o.providerDid!==n);r.length===0?t?.removeItem(Ae):t?.setItem(Ae,JSON.stringify(r))}catch{}}function Or(){let t,e={active:!0},n=new Promise((r,o)=>{t=()=>{e.active===!0&&(e.active=!1,o(new Q))}});return n.catch(()=>{}),e.cancelled=n,e.cancel=t,e}function tt(t,e){return()=>t(e)}function rt(t){if(typeof window>"u"||typeof document>"u")throw new Error("[@enbox/browser] The connect modal is only available in browser environments.");if(t.mode==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e={...kr(),...t.deps},n=Ur(t.wallets??[]),r=t.rememberChoice??!0,o=t.appName??window.location.host,i=t.applicationId??window.location.origin,s=e.isMobile(),a=t.mode==="refresh",d=r?Tr(e.storage):void 0,p=r&&a?Mr(e.storage,t.delegatePortableDid?.uri,t.expectedProviderDid):void 0,g=t.expectedProviderDid??p?.providerDid,x=t.relayWalletPath??"/connect/app",C=t.walletUrl===void 0?"Choose another wallet or method":"Choose another method",R=d!==void 0&&(a||Yt(n,d.walletUrl))?d.walletUrl:void 0,u=p?.walletUrl??t.walletUrl??R??n[0]?.url,w=p?.method??t.preferredMethod??d?.method??"phone";return new Promise((E,he)=>{let O=document.createElement("div");O.id="enbox-connect-modal";let ge=O.attachShadow({mode:"open"}),lt=document.createElement("style");lt.textContent=Br,ge.appendChild(lt);let Z=document.createElement("div");Z.className="overlay";let k=document.createElement("div");k.className="modal",k.setAttribute("role","dialog"),k.setAttribute("aria-modal","true");let ct=a?`Reconnect to ${o}`:`Connect to ${o}`;k.setAttribute("aria-label",ct);let U=t.theme??{},ee=U.appearance??"auto";ee!=="auto"&&(k.dataset.appearance=ee);let Oe=window.matchMedia?.("(prefers-color-scheme: dark)"),nn=U.accent!==void 0||U.accentContrast!==void 0||U.light!==void 0||U.dark!==void 0,dt=()=>{let l=Oe?.matches===!0?"dark":"light",c=ee==="auto"?l:ee,v={accent:U.accent,accentContrast:U.accentContrast,...U[c]};for(let f of Object.keys(et)){let y=v[f];typeof y=="string"&&y.trim()!==""?k.style.setProperty(et[f],y):k.style.removeProperty(et[f])}},pt=()=>dt();nn&&(dt(),ee==="auto"&&Oe?.addEventListener?.("change",pt));let T=!1,A,ut,ve,Ue=!1,F,rn=()=>F,on=()=>{F=void 0},ft=new Map,z=[],te=l=>n.find(c=>c.url===l)??{name:Wr(l)??l,url:l},sn=()=>{if(u===void 0){z=n.slice(0,zt);return}if(z.some(c=>c.url===u))return;let l=te(u);z=[l,...n.filter(c=>c.url!==l.url)].slice(0,zt)},be=l=>{u=l,Y(),re()},an=()=>{A?.cancel(),W(),document.removeEventListener("keydown",yt),document.removeEventListener("visibilitychange",Et),Oe?.removeEventListener?.("change",pt);try{O.remove()}catch{}},we=l=>{T||(T=!0,an(),l())},mt=l=>{r&&u!==void 0&&(Dr(e.storage,{method:w,walletUrl:u}),Lr(e.storage,{delegateDid:l.delegatePortableDid.uri,providerDid:l.connectedDid,method:w,walletUrl:u})),fn(),setTimeout(tt(we,()=>E(l)),1200)},We=()=>we(()=>he(new Error("[@enbox/browser] Connect cancelled.")));k.appendChild(qr(ct,t.appIcon,We));let N=document.createElement("div");N.className="stage",N.setAttribute("aria-live","polite"),k.appendChild(N);let I=document.createElement("div");I.className="footer",k.appendChild(I);let _=(...l)=>{N.replaceChildren(...l),N.classList.remove("fade-in"),N.offsetWidth,N.classList.add("fade-in")},ht=l=>{_(m("div","spinner"),m("p","stage-caption",l))},ln=l=>{let c=A;setTimeout(()=>{T||c!==A||c?.active!==!0||F!==void 0||dn(l)},0)},gt=(l,c,v)=>{let f=document.createElement("a");return f.className=v,f.href=l.walletUri,f.target="_blank",f.rel="noopener noreferrer",f.addEventListener("click",()=>{ln(c)}),f},cn=l=>{let c=u!==void 0?te(u):void 0,v=c?.name??"your wallet",f=gt(l,v,"qr-box qr-link");if(f.setAttribute("aria-label",`Open ${v} on this device`),f.replaceChildren(Qe(Ge(l.walletUri),{dark:"#14141f",light:"transparent",quietZone:2})),c!==void 0){let y=m("div","qr-logo");y.appendChild(de(c)),f.appendChild(y)}if(s){let y=gt(l,v,"deep-link");c!==void 0&&y.appendChild(de(c)),y.appendChild(m("span","deep-link-label",`Continue in ${v}`)),f.classList.add("compact"),_(y,m("p","stage-subline",`${v} opens in a new tab \u2014 approve there, then come back for your code.`),m("div","stage-divider","or scan with another phone"),f);return}_(f,m("p","stage-caption","Scan with your phone\u2019s camera"),m("p","stage-subline",`${v} stays on your phone \u2014 or click the code to open it here.`))},dn=l=>{_(m("div","spinner"),m("p","stage-caption",`Finish in ${l}`),m("p","stage-subline",s?`Approve the connection in the ${l} tab, then come back here for your code.`:"Approve the connection in the tab that just opened, then come back here for your code."),K("Start over",()=>{Ee()}))},pn=()=>{let l=u!==void 0?te(u).name:"your wallet",c=document.createElement("div");c.className="claimed-pulse",_(c,m("p","stage-caption",`Request received \u2014 approve in ${l}`),m("p","stage-subline","Once you approve, you\u2019ll get a code to enter here."))},un=(l,c)=>new Promise(v=>{F=v;let f=u!==void 0?te(u).name:"your wallet",y=document.createElement("div");y.className="pin-row",c!==void 0&&y.classList.add("shake");let q=Nr(y,rn,on,ht);_(m("p","stage-caption",`Enter the code shown in ${f}`),y,...c!==void 0?[m("p","stage-error",`That code doesn\u2019t match \u2014 check ${f}.`)]:[m("p","stage-subline",l===1?"This confirms you\u2019re the one approving.":"")]),q[0].focus()}),fn=()=>{let l=m("div","check");l.textContent="\u2713",_(l,m("p","stage-caption","You\u2019re connected."))},vt=()=>{_(m("p","stage-caption","No problem \u2014 nothing was shared."),X("Start over",()=>{re()}),K("Close",tt(we,()=>E(void 0))))},qe=()=>{p!==void 0&&(A?.cancel(),A=void 0,W(),Ar(e.storage,p.delegateDid,p.providerDid),p=void 0,t.walletUrl!==void 0&&(u=t.walletUrl),Y(),_(m("p","stage-caption","Choose another way to reconnect."),m("p","stage-subline","We\u2019ll still require the same wallet profile used for this session.")))},ye=(l,c)=>{_(m("p","stage-caption",l),X("Start over",()=>{re()}),...p!==void 0?[K(C,qe)]:[],K("Close",tt(we,()=>he(c??new Error(`[@enbox/browser] ${l}`)))))},mn=()=>{if(p!==void 0){_(m("p","stage-caption","Your saved wallet connection is unavailable right now."),m("p","stage-subline","Try again in a moment to reconnect the same session."),X("Try again",()=>{Ee()}),K(C,qe));return}_(m("p","stage-caption","This wallet can\u2019t connect by phone here."),m("p","stage-subline","You can continue in this browser instead."),X("Use this browser",()=>{xe()}))},ne=s?"tab":"window",hn=()=>{let l=u!==void 0?te(u).name:"your wallet",c=p!==void 0,f=c?`We\u2019ll open the same ${l} profile used for this session.`:s?"Your wallet opens in a new tab to approve this connection \u2014 no code needed.":"Your wallet opens in a small window to approve this connection.",q=c?`Open ${l} ${ne}`:s?"Open wallet":"Open wallet window";_(m("p","stage-caption",c?`Reconnect with ${l}`:"Connect with a wallet in this browser"),m("p","stage-subline",f),X(q,()=>{xe()}))},gn=()=>{_(m("div","spinner"),m("p","stage-caption",`Finish in the wallet ${ne}`),m("p","stage-subline","We\u2019ll wrap up here as soon as you\u2019re done."))},vn=l=>{_(m("p","stage-caption",l?`Your browser blocked the wallet ${ne}.`:`The wallet ${ne} was closed.`),X(l?"Open it now":`Reopen ${ne}`,()=>{xe()}),...p!==void 0?[K(C,qe)]:[K(s?"Use a code instead":"Use your phone instead",()=>{wt("phone")})])},bn=l=>{if(T)return;let c=l instanceof Error?l:new Error(String(l)),v=/popup blocked/i.test(c.message);if(l instanceof $||v){vn(v);return}ye(/timed out/i.test(c.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",c)},wn=async l=>{if(t.connectServerUrl!==void 0)return t.connectServerUrl;let c=ft.get(l);return c===void 0&&(c=e.discoverConnectServerUrl(l),ft.set(l,c)),c},W=()=>{clearTimeout(ut),ve=void 0},bt=()=>{!T&&F===void 0&&w==="phone"&&Ee()},yn=l=>{W();let c=Math.max(Cr,l*1e3-xr);ve=Date.now()+c,ut=setTimeout(bt,c)},Ee=async()=>{if(A?.cancel(),W(),u===void 0){ye("No wallet is configured.");return}w="phone",Y(),ht("Getting things ready\u2026");let l=new URL(u).origin,c=await wn(l);if(c===void 0){mn();return}let v=Or();A=v;try{let f=await e.runRelay({connectServerUrl:c,walletUri:new URL(x,l).toString(),appName:o,appIcon:t.appIcon,applicationId:i,clientMetadata:Se(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.mode,expectedProviderDid:g,timeoutMs:t.timeout,cancelled:v.cancelled,onWalletUriReady:y=>{v.active&&!T&&(cn(y),yn(y.expiresIn))},onClaimed:()=>{v.active&&!T&&(W(),pn())},requestPin:(y,q)=>(W(),un(y,q))});if(!v.active||T)return;f===void 0?vt():mt(f)}catch(f){if(!v.active||T||f instanceof Q)return;let y=f instanceof Error?f:new Error(String(f));ye(/timed out/i.test(y.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",y)}},xe=async()=>{if(A?.cancel(),W(),u===void 0){ye("No wallet is configured.");return}if(!Ue){w="browser",Y(),Ue=!0,gn();try{let l=await e.runPopup({walletUrl:u,permissionRequests:t.permissionRequests,appName:o,appIcon:t.appIcon,applicationId:i,timeoutMs:t.timeout,delegatePortableDid:t.delegatePortableDid,requestType:t.mode,expectedProviderDid:g});if(T)return;l===void 0?vt():mt(l)}catch(l){bn(l)}finally{Ue=!1}}},re=async()=>{w==="browser"?(A?.cancel(),W(),Y(),hn()):await Ee()},wt=async l=>{w=l,await re()},Y=()=>{if(I.replaceChildren(),p===void 0&&t.walletUrl===void 0){sn();let c=En();c.label!==void 0&&I.appendChild(c.label),I.appendChild(c.row),I.appendChild(c.panel)}let l=document.createElement("div");if(l.className="footer-row",w==="phone"&&p===void 0){let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Or connect without a code \u2192":"No phone? Use this browser \u2192",c.addEventListener("click",()=>{xe()}),l.appendChild(c)}else if(w==="browser"&&p===void 0){let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Use a code instead \u2192":"Use your phone instead \u2192",c.addEventListener("click",()=>{wt("phone")}),l.appendChild(c)}l.childElementCount>0&&I.appendChild(l)},En=()=>{let l=document.createElement("div");l.className="wallet-row",l.setAttribute("role","radiogroup"),l.setAttribute("aria-label","Wallet");for(let h of z){let b=document.createElement("button");b.className="row-tile",b.title=h.description??h.name,b.setAttribute("role","radio");let D=h.url===u;b.setAttribute("aria-checked",D?"true":"false"),D&&b.classList.add("selected"),b.appendChild(de(h)),b.appendChild(m("span","row-tile-name",h.name)),b.addEventListener("click",()=>{h.url!==u&&be(h.url)}),l.appendChild(b)}let c=document.createElement("div");c.className="wallet-panel",c.hidden=!0;let v=n.filter(h=>!Yt(z,h.url)),f=document.createElement("button");f.className="row-tile more-tile",f.title="All wallets",f.setAttribute("aria-expanded","false"),f.appendChild(m("span","more-count",v.length>0?`+${v.length}`:"\u22EF")),f.appendChild(m("span","row-tile-name","More")),f.addEventListener("click",()=>{c.hidden=!c.hidden,f.setAttribute("aria-expanded",c.hidden?"false":"true"),c.hidden||Ie()}),l.appendChild(f);let y=z.length>0?m("div","wallet-row-label","Connecting with"):void 0,q=[],oe=document.createElement("div");if(oe.className="wallet-empty",oe.textContent="No other wallets match your search.",oe.hidden=!0,v.length>_r){let h=document.createElement("input");h.type="search",h.className="wallet-search",h.placeholder="Search wallets\u2026",h.setAttribute("aria-label","Search wallets"),h.addEventListener("input",()=>{let b=h.value.trim().toLowerCase(),D=0;for(let{wallet:Ct,el:xn}of q){let _t=b===""||Ct.name.toLowerCase().includes(b)||Ct.url.toLowerCase().includes(b);xn.hidden=!_t,_t&&(D+=1)}oe.hidden=D>0,Ie()}),c.appendChild(h)}let ie=document.createElement("div");ie.className="wallet-scroll-wrap",ie.hidden=v.length===0;let S=document.createElement("div");S.className="wallet-scroll";let Ne=document.createElement("div");Ne.className="wallet-grid";let Ie=()=>{let h=S.scrollHeight-S.clientHeight>1,b=S.scrollTop+S.clientHeight>=S.scrollHeight-1;ie.classList.toggle("scroll-hint",h&&!b)};S.addEventListener("scroll",Ie);for(let h of v){let b=document.createElement("button");b.className="wallet-tile",b.title=h.description??h.name,b.appendChild(de(h));let D=document.createElement("span");D.className="wallet-tile-name",D.textContent=h.name,b.appendChild(D),b.addEventListener("click",()=>{be(h.url)}),q.push({wallet:h,el:b}),Ne.appendChild(b)}S.appendChild(Ne),S.appendChild(oe),ie.appendChild(S),c.appendChild(ie);let Ce=document.createElement("div");Ce.className="wallet-custom";let M=document.createElement("input");M.className="url-input",M.type="url",M.placeholder="https://your-wallet.example";let L=document.createElement("button");L.className="url-go",L.textContent="Use";let B=document.createElement("div");B.className="url-error",B.hidden=!0;let Be=!1,xt=async()=>{let h=M.value.trim();if(h==="")return;let b;try{b=new URL(h.includes("://")?h:`https://${h}`).origin}catch{M.classList.add("invalid");return}if(Be){be(b);return}L.disabled=!0,L.textContent="Checking\u2026",B.hidden=!0;let D=await e.validateWalletUrl(b);if(L.disabled=!1,D){L.textContent="Use",be(b);return}Be=!0,L.textContent="Use anyway",M.classList.add("invalid"),B.textContent=`Couldn't verify a wallet at ${b}.`,B.hidden=!1};return M.addEventListener("input",()=>{Be=!1,L.textContent="Use",M.classList.remove("invalid"),B.hidden=!0}),M.addEventListener("keydown",h=>{h.key==="Enter"&&xt()}),L.addEventListener("click",()=>{xt()}),Ce.appendChild(M),Ce.appendChild(L),c.appendChild(Ce),c.appendChild(B),{label:y,row:l,panel:c}};Z.addEventListener("click",l=>{l.target===Z&&We()});let yt=l=>{if(l.key==="Escape"){We();return}l.key==="Tab"&&Ir(ge,l)};document.addEventListener("keydown",yt);let Et=()=>{if(!(document.visibilityState!=="visible"||T)){if(ve!==void 0&&Date.now()>=ve){bt();return}F!==void 0&&Array.from(ge.querySelectorAll(".pin-input")).find(c=>c.value==="")?.focus()}};document.addEventListener("visibilitychange",Et),Z.appendChild(k),ge.appendChild(Z),document.body.appendChild(O),Y(),re()})}function Yt(t,e){return t.some(n=>n.url===e)}function Zt(t){if(typeof t!="string"||t.trim()==="")return!1;try{let e=new URL(t);return e.protocol==="http:"||e.protocol==="https:"}catch{return!1}}function Ur(t){return t.filter((e,n)=>t.findIndex(r=>r.url===e.url)===n)}function Wr(t){if(t!==void 0)try{return new URL(t).hostname}catch{return t}}function m(t,e,n){let r=document.createElement(t);return r.className=e,n!==void 0&&(r.textContent=n),r}function X(t,e){let n=document.createElement("button");return n.className="stage-btn",n.textContent=t,n.addEventListener("click",e),n}function K(t,e){let n=document.createElement("button");return n.className="footer-link",n.textContent=t,n.addEventListener("click",e),n}function qr(t,e,n){let r=document.createElement("div");r.className="header";let o=document.createElement("div");if(o.className="header-identity",e!==void 0){let a=document.createElement("img");a.className="header-icon",a.src=e,a.alt="",a.width=24,a.height=24,a.addEventListener("error",()=>a.remove()),o.appendChild(a)}let i=document.createElement("h2");i.textContent=t,o.appendChild(i);let s=document.createElement("button");return s.className="close-btn",s.setAttribute("aria-label","Close"),s.textContent="\xD7",s.addEventListener("click",n),r.appendChild(o),r.appendChild(s),r}function Nr(t,e,n,r){let o=[];for(let s=0;s<Le;s++){let a=document.createElement("input");a.className="pin-input",a.type="text",a.inputMode="numeric",a.maxLength=1,a.setAttribute("aria-label",`Code digit ${s+1}`),o.push(a),t.appendChild(a)}let i=()=>{let s=o.map(d=>d.value).join(""),a=e();if(s.length===Le&&a!==void 0){let d=a;n(),r("Checking the code\u2026"),d(s)}};return o.forEach((s,a)=>{s.addEventListener("input",()=>{s.value=s.value.replace(/\D/g,"").slice(0,1),s.value!==""&&a+1<o.length&&o[a+1].focus(),i()}),s.addEventListener("keydown",d=>{d.key==="Backspace"&&s.value===""&&a>0&&o[a-1].focus()}),s.addEventListener("paste",d=>{let p=(d.clipboardData?.getData("text")??"").replace(/\D/g,"").slice(0,Le);p.length!==0&&(d.preventDefault(),p.split("").forEach((g,x)=>{o[x]!==void 0&&(o[x].value=g)}),o[Math.min(p.length,Le)-1]?.focus(),i())})}),o}function Ir(t,e){let n=Array.from(t.querySelectorAll('button, input, a[href], [tabindex]:not([tabindex="-1"])')).filter(s=>!s.hasAttribute("disabled")&&s.offsetParent!==null);if(n.length===0)return;let r=n[0],o=n[n.length-1],i=t.activeElement;e.shiftKey&&(i===r||i===null)?(e.preventDefault(),o.focus()):!e.shiftKey&&i===o&&(e.preventDefault(),r.focus())}var Gt=`
|
|
1
|
+
export*from"@enbox/api";import{ConnectClient as pr}from"@enbox/connect";function se(t){let e=document.createElement("span");e.className="wallet-icon";let n=document.createElement("span");n.className="wallet-badge",n.textContent=t.name.charAt(0).toUpperCase(),e.appendChild(n);let r=Rn(t);if(r.length===0)return e;let o=document.createElement("img");o.className="wallet-img",o.alt="",o.width=28,o.height=28;let i=0;return o.addEventListener("error",()=>{i+=1,i<r.length?o.src=r[i]:o.remove()}),o.src=r[i],e.appendChild(o),e}function Rn(t){if(t.icon!==void 0)return[t.icon];let e;try{e=new URL(t.url).origin}catch{return[]}return[`${e}/favicon.svg`,`${e}/favicon.ico`,`${e}/favicon.png`]}import{assertX25519PublicJwk as kn,CONNECT_DENIED_TOKEN as Tn,ConnectClient as Sn}from"@enbox/connect";function _e(){let t,e,n=new Promise((r,o)=>{t=r,e=o});return n.catch(()=>{}),{promise:n,resolve:t,reject:e}}var He="/dweb-connect",ae="enbox-connect-loaded",le="enbox-connect-request",ce="enbox-connect-response",de="enbox-connect-ack";function Pe(t,e,n){if(t.origin!==e||t.source!==n)return;let r=t.data;if(!(typeof r!="object"||r===null))return r}var Dn=3e5,Mn=500,An=1500,Ln="enbox-dweb-connect",Rt=500,kt=700;function On(){let t=`width=${Rt},height=${kt},menubar=no,toolbar=no,location=no,status=no`,e=window.outerWidth>0?window.outerWidth:window.screen?.availWidth??0,n=window.outerHeight>0?window.outerHeight:window.screen?.availHeight??0;if(e===0||n===0)return t;let r=Math.max(0,Math.round((window.screenX??0)+(e-Rt)/2)),o=Math.max(0,Math.round((window.screenY??0)+(n-kt)/2));return`${t},left=${r},top=${o}`}function Wn(){if(typeof window>"u")throw new TypeError("[@enbox/browser] DWeb Connect is only available in browser environments.")}var H=class extends Error{constructor(){super("[@enbox/browser] Wallet popup was closed before the wallet finished loading."),this.name="PopupWindowClosedError"}},G=class{constructor(e){this.requiresPin=!1;this._settled=!1;this._walletEpkReceived=!1;Wn(),this._walletOrigin=new URL(e.walletUrl).origin,this._timeoutMs=e.timeoutMs??Dn;let n=new URL(He,e.walletUrl).toString(),r=window.open(n,Ln,On());if(!r)throw new Error("[@enbox/browser] Popup blocked. Allow popups for this site to connect to a wallet.");this._popup=r,this._walletEpkPromise=new Promise((i,s)=>{this._resolveWalletEpk=i,this._rejectWalletEpk=s});let o=_e();this._responsePromise=o.promise,this._resolveResponse=o.resolve,this._rejectResponse=o.reject,this._messageListener=i=>{this.onMessage(i)},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()},Mn)}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:le,jwe:e},this._walletOrigin)}async awaitResponse(){return await this._responsePromise}async confirmComplete(){this._popup.closed!==!0&&this._popup.postMessage({type:de},this._walletOrigin)}onMessage(e){let n=Pe(e,this._walletOrigin,this._popup);if(n!==void 0){if(n.type===ae){this.onLoadedBeacon(n);return}n.type===ce&&this.onResponseMessage(n)}}onLoadedBeacon(e){if(this._settled||this._walletEpkReceived)return;let n;try{kn(e.walletEpk),n=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?.(n)}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 H);return}clearInterval(this._closedPollId),setTimeout(()=>{this._settled||(this._settled=!0,this.cleanup(),this._resolveResponse(Tn))},An)}}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 Re(){let t=Intl.DateTimeFormat().resolvedOptions(),e=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,...e&&e.length>0?{languages:e}:{},...t.timeZone?{timezone:t.timeZone}:{}}}async function Un(t){let e=new G({walletUrl:t.walletUrl,timeoutMs:t.timeout}),n=new Sn({transport:e});try{return await n.connect({appName:t.appName??globalThis.location.host,appIcon:t.appIcon,clientMetadata:Re(),permissionRequests:t.permissionRequests})}catch(r){if(r instanceof H)return;throw r}}var St=[-1,10,16,26,18,24,16,18,22,22,26],Dt=[-1,1,1,1,2,2,4,4,4,5,5],Mt=[-1,26,44,70,100,134,172,196,242,292,346],qn=0,At=10;function Lt(t){return Mt[t]-St[t]*Dt[t]}function ze(t,e){let n=new TextEncoder().encode(t),r=Nn(n.length);if(r===0)throw new Error(`[@enbox/browser] QR payload too long (${n.length} bytes exceeds version ${At}-M capacity).`);let o=In(n,r),i=Hn(o,r),s=17+4*r,a=Array.from({length:s},()=>new Array(s).fill(!1)),d=Array.from({length:s},()=>new Array(s).fill(!1));Fn(a,d,r),Gn(a,d,i);let p=e??-1;return p===-1&&(p=Bn(a,d)),Fe(a,d,p),Ye(a,d,p),{size:s,modules:a,version:r,mask:p}}function Nn(t){for(let e=1;e<=At;e++){let n=Lt(e)*8;if(4+(e<=9?8:16)+t*8<=n)return e}return 0}function In(t,e){let n=[],r=(d,p)=>{for(let g=p-1;g>=0;g--)n.push(d>>>g&1)};r(4,4),r(t.length,e<=9?8:16);for(let d of t)r(d,8);let o=Lt(e)*8;r(0,Math.min(4,o-n.length)),r(0,(8-n.length%8)%8);let i=[236,17],s=0;for(;n.length<o;)r(i[s],8),s^=1;let a=new Uint8Array(o/8);for(let d=0;d<n.length;d++)a[d>>3]|=n[d]<<7-(d&7);return a}function Bn(t,e){let n=0,r=1/0;for(let o=0;o<8;o++){Fe(t,e,o),Ye(t,e,o);let i=tr(t);i<r&&(r=i,n=o),Fe(t,e,o)}return n}function Hn(t,e){let n=Dt[e],r=St[e],o=Mt[e],i=n-o%n,s=Math.floor(o/n),a=[],d=[],p=jn(r),g=0;for(let u=0;u<n;u++){let b=s-r+(u<i?0:1),E=t.slice(g,g+b);g+=b,a.push(E),d.push($n(E,p))}let x=new Uint8Array(o),C=0,R=s-r+1;for(let u=0;u<R;u++)for(let b=0;b<n;b++)u<a[b].length&&(x[C++]=a[b][u]);for(let u=0;u<r;u++)for(let b=0;b<n;b++)x[C++]=d[b][u];return x}function Ke(t,e){let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(e>>>r&1)*t;return n&255}function jn(t){let e=new Uint8Array(t);e[t-1]=1;let n=1;for(let r=0;r<t;r++){for(let o=0;o<t;o++)e[o]=Ke(e[o],n),o+1<t&&(e[o]^=e[o+1]);n=Ke(n,2)}return e}function $n(t,e){let n=new Uint8Array(e.length);for(let r of t){let o=r^n[0];n.copyWithin(0,1),n[n.length-1]=0;for(let i=0;i<e.length;i++)n[i]^=Ke(e[i],o)}return n}var Kn=[[],[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50]];function P(t,e,n,r,o){t[r][n]=o,e[r][n]=!0}function Fn(t,e,n){let r=t.length;for(let i=0;i<r;i++)P(t,e,6,i,i%2===0),P(t,e,i,6,i%2===0);je(t,e,3,3),je(t,e,r-4,3),je(t,e,3,r-4);let o=Kn[n];for(let i=0;i<o.length;i++)for(let s=0;s<o.length;s++)i===0&&s===0||i===0&&s===o.length-1||i===o.length-1&&s===0||zn(t,e,o[i],o[s]);Ye(t,e,0),P(t,e,8,r-8,!0),n>=7&&Yn(t,e,n)}function je(t,e,n,r){let o=t.length;for(let i=-4;i<=4;i++)for(let s=-4;s<=4;s++){let a=n+s,d=r+i;if(a<0||a>=o||d<0||d>=o)continue;let p=Math.max(Math.abs(s),Math.abs(i));P(t,e,a,d,p!==2&&p!==4)}}function zn(t,e,n,r){for(let o=-2;o<=2;o++)for(let i=-2;i<=2;i++)P(t,e,n+i,r+o,Math.max(Math.abs(i),Math.abs(o))!==1)}function Ye(t,e,n){let r=t.length,o=qn<<3|n,i=o;for(let a=0;a<10;a++)i=i<<1^(i>>>9)*1335;let s=(o<<10|i)^21522;for(let a=0;a<=5;a++)P(t,e,8,a,(s>>>a&1)!==0);P(t,e,8,7,(s>>>6&1)!==0),P(t,e,8,8,(s>>>7&1)!==0),P(t,e,7,8,(s>>>8&1)!==0);for(let a=9;a<15;a++)P(t,e,14-a,8,(s>>>a&1)!==0);for(let a=0;a<8;a++)P(t,e,r-1-a,8,(s>>>a&1)!==0);for(let a=8;a<15;a++)P(t,e,8,r-15+a,(s>>>a&1)!==0)}function Yn(t,e,n){let r=t.length,o=n;for(let s=0;s<12;s++)o=o<<1^(o>>>11)*7973;let i=n<<12|o;for(let s=0;s<18;s++){let a=(i>>>s&1)!==0,d=r-11+s%3,p=Math.floor(s/3);P(t,e,d,p,a),P(t,e,p,d,a)}}function Gn(t,e,n){let r=t.length,o=0;for(let i=r-1;i>=1;i-=2){let s=i<=6?i-1:i;o=Jn(t,e,n,s,r,o)}}function Jn(t,e,n,r,o,i){for(let s=0;s<o;s++)for(let a=0;a<2;a++){let{x:d,y:p}=Qn(r,s,a,o);!e[p][d]&&i<n.length*8&&(t[p][d]=(n[i>>3]>>>7-(i&7)&1)!==0,i++)}return i}function Qn(t,e,n,r){let o=t-n,s=(t+1&2)===0?r-1-e:e;return{x:o,y:s}}function Fe(t,e,n){let r=t.length;for(let o=0;o<r;o++)for(let i=0;i<r;i++){if(e[o][i])continue;let s;switch(n){case 0:s=(i+o)%2===0;break;case 1:s=o%2===0;break;case 2:s=i%3===0;break;case 3:s=(i+o)%3===0;break;case 4:s=(Math.floor(i/3)+Math.floor(o/2))%2===0;break;case 5:s=i*o%2+i*o%3===0;break;case 6:s=(i*o%2+i*o%3)%2===0;break;default:s=((i+o)%2+i*o%3)%2===0;break}s&&(t[o][i]=!t[o][i])}}function Xn(t,e){let n=0;for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[r][s]!==o?(o=t[r][s],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[s][r]!==o?(o=t[s][r],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}return n}function Vn(t,e){let n=0;for(let r=0;r<e-1;r++)for(let o=0;o<e-1;o++){let i=t[r][o];i===t[r][o+1]&&i===t[r+1][o]&&i===t[r+1][o+1]&&(n+=3)}return n}function Tt(t,e){if(![!0,!1,!0,!0,!0,!1,!0].every((s,a)=>t[e+a]===s))return 0;let o=e>=4&&t.slice(e-4,e).every(s=>!s),i=e+11<=t.length&&t.slice(e+7,e+11).every(s=>!s);return(o?40:0)+(i?40:0)}function Zn(t,e){let n=0;for(let r=0;r<e;r++){let o=t[r],i=t.map(s=>s[r]);for(let s=0;s+7<=e;s++)n+=Tt(o,s),n+=Tt(i,s)}return n}function er(t,e){let n=0;for(let i of t)for(let s of i)s&&n++;let r=e*e;return(Math.ceil(Math.abs(n*20-r*10)/r)-1)*10}function tr(t){let e=t.length,n=0;return n+=Xn(t,e),n+=Vn(t,e),n+=Zn(t,e),n+=er(t,e),n}var $e="http://www.w3.org/2000/svg";function Ge(t,e={}){let n=e.dark??"#000000",r=e.light??"#ffffff",o=e.quietZone??2,i=t.size+o*2,s="";for(let g=0;g<t.size;g++)for(let x=0;x<t.size;x++)t.modules[g][x]&&(s+=`M${x+o} ${g+o}h1v1h-1z`);let a=document.createElementNS($e,"svg");a.setAttribute("viewBox",`0 0 ${i} ${i}`),a.setAttribute("shape-rendering","crispEdges"),a.setAttribute("role","img");let d=document.createElementNS($e,"rect");d.setAttribute("width",String(i)),d.setAttribute("height",String(i)),d.setAttribute("fill",r),a.appendChild(d);let p=document.createElementNS($e,"path");return p.setAttribute("d",s),p.setAttribute("fill",n),a.appendChild(p),a}var Ot="/.well-known/enbox-connect";async function ke(t){try{let e=new URL(Ot,t).toString(),n=await fetch(e,{signal:AbortSignal.timeout(6e3)});if(!n.ok)return;let r=await n.json();return typeof r?.connectServerUrl!="string"?void 0:{connectServerUrl:r.connectServerUrl}}catch{return}}async function Je(t){return await ke(t)!==void 0}import{DidJwk as nr}from"@enbox/dids";import{X25519 as rr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as or,openResponse as ir,randomToken as Wt,RelayClientTransport as sr,resolveDelegatePortableDid as ar,sealRequest as lr}from"@enbox/connect";var Qe=6,J=class extends Error{constructor(){super("[@enbox/browser] Relay connect cancelled."),this.name="RelayConnectCancelledError"}};function cr(t){return new Promise(e=>{if(typeof document>"u"){setTimeout(e,t);return}let n=()=>{clearTimeout(o),document.removeEventListener("visibilitychange",r),e()},r=()=>{document.visibilityState==="visible"&&n()},o=setTimeout(n,t);document.addEventListener("visibilitychange",r)})}async function Xe(t){if(t.requestType==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e=t.createTransport??(E=>new sr({...E,sleep:cr})),n=t.cancelled===void 0?void 0:new AbortController,r=e({connectServerUrl:t.connectServerUrl,walletUri:t.walletUri,timeoutMs:t.timeoutMs,pollIntervalMs:t.pollIntervalMs,onClaimed:t.onClaimed,signal:n?.signal}),o=await nr.create(),i=await rr.generateKey(),s={kty:"OKP",crv:"X25519",x:i.x},a=Wt(),d=Wt(),p=await r.requestProfile(d),g={clientDid:o.uri,appName:t.appName,appIcon:t.appIcon,applicationId:t.applicationId,clientMetadata:t.clientMetadata,permissionRequests:t.permissionRequests,delegateDid:t.delegatePortableDid?.uri,requestType:t.requestType,expectedProviderDid:t.expectedProviderDid,supportedDidMethods:["did:dht","did:jwk"],nonce:a,state:d,responseKey:s,reply:p.reply},x=await lr({request:g,signer:o,encryption:p.encryption}),C=await r.deliverRequest(x);C!==void 0&&t.onWalletUriReady(C);let R=t.cancelled===void 0?r.awaitResponse():Promise.race([r.awaitResponse(),t.cancelled]),u;try{u=await R}catch(E){throw n?.abort(),E}if(u===or)return;let b;for(let E=1;E<=Qe;E++){let he=await(t.cancelled===void 0?t.requestPin(E,b):Promise.race([t.requestPin(E,b),t.cancelled])),O=await dr({responseCiphertext:u,responsePrivateKey:i,clientDid:o.uri,nonce:a,state:d,pin:he,expectedProviderDid:t.expectedProviderDid,delegatePortableDid:t.delegatePortableDid,confirmComplete:r.confirmComplete?.bind(r)});if(O.matched)return O.result;b=O.error}throw new Error(`[@enbox/browser] The pairing code did not match after ${Qe} attempts.`)}async function dr(t){try{let e=await ir({jwe:t.responseCiphertext,recipientPrivateKey:t.responsePrivateKey,expected:{clientDid:t.clientDid,nonce:t.nonce,state:t.state,providerDid:t.expectedProviderDid},pin:t.pin}),n=ar({localDelegatePortableDid:t.delegatePortableDid,response:e});return t.confirmComplete?.().catch(()=>{}),{matched:!0,result:{delegatePortableDid:n,delegateGrants:e.delegateGrants,connectedDid:e.providerDid,sessionRevocations:e.sessionRevocations}}}catch(e){let n=e instanceof Error?e:new Error(String(e));if(n.message.startsWith("Connect:"))throw n;return{matched:!1,error:n}}}var Bt="enbox:connect:lastChoice",Se="enbox:connect:sessionChoices",Ht=20,ur=12e4,fr=1e4,Te=4,mr=4,Ut=3,Ve={background:"--ec-bg",surface:"--ec-surface",text:"--ec-text",textMuted:"--ec-muted",border:"--ec-border",accent:"--ec-accent",accentContrast:"--ec-accent-contrast",danger:"--ec-danger",success:"--ec-success"};async function jt(t){return(await ke(t))?.connectServerUrl}async function hr(t){let e=new G({walletUrl:t.walletUrl,timeoutMs:t.timeoutMs});return await new pr({transport:e}).connect({appName:t.appName,appIcon:t.appIcon,applicationId:t.applicationId,clientMetadata:Re(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.requestType,expectedProviderDid:t.expectedProviderDid})}function gr(){return typeof window>"u"?!1:(window.matchMedia?.("(pointer: coarse)").matches??!1)&&Math.min(window.innerWidth,window.innerHeight)<900}function vr(){return{runRelay:Xe,runPopup:hr,discoverConnectServerUrl:jt,validateWalletUrl:Je,isMobile:gr,storage:typeof localStorage>"u"?void 0:localStorage}}function wr(t){try{let e=t?.getItem(Bt);if(e==null)return;let n=JSON.parse(e);if((n.method==="phone"||n.method==="browser")&&$t(n.walletUrl))return{method:n.method,walletUrl:n.walletUrl}}catch{}}function br(t,e){try{t?.setItem(Bt,JSON.stringify(e))}catch{}}function yr(t){if(typeof t!="object"||t===null)return!1;let e=t;return(e.method==="phone"||e.method==="browser")&&$t(e.walletUrl)&&typeof e.delegateDid=="string"&&e.delegateDid.length>0&&typeof e.providerDid=="string"&&e.providerDid.length>0}function et(t){try{let e=t?.getItem(Se);if(e==null)return[];let n=JSON.parse(e);return Array.isArray(n)?n.filter(yr).slice(-Ht):[]}catch{return[]}}function Er(t,e,n){if(e===void 0)return;let r=et(t);for(let o=r.length-1;o>=0;o--){let i=r[o];if(i.delegateDid===e&&(n===void 0||i.providerDid===n))return i}}function xr(t,e){try{let n=et(t).filter(r=>r.delegateDid!==e.delegateDid||r.providerDid!==e.providerDid);n.push(e),t?.setItem(Se,JSON.stringify(n.slice(-Ht)))}catch{}}function Cr(t,e,n){try{let r=et(t).filter(o=>o.delegateDid!==e||o.providerDid!==n);r.length===0?t?.removeItem(Se):t?.setItem(Se,JSON.stringify(r))}catch{}}function _r(){let t,e={active:!0},n=new Promise((r,o)=>{t=()=>{e.active===!0&&(e.active=!1,o(new J))}});return n.catch(()=>{}),e.cancelled=n,e.cancel=t,e}function Ze(t,e){return()=>t(e)}function tt(t){if(typeof window>"u"||typeof document>"u")throw new Error("[@enbox/browser] The connect modal is only available in browser environments.");if(t.mode==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e={...vr(),...t.deps},n=Pr(t.wallets??[]),r=t.rememberChoice??!0,o=t.appName??window.location.host,i=t.applicationId??window.location.origin,s=e.isMobile(),a=t.mode==="refresh",d=r?wr(e.storage):void 0,p=r&&a?Er(e.storage,t.delegatePortableDid?.uri,t.expectedProviderDid):void 0,g=t.expectedProviderDid??p?.providerDid,x=t.relayWalletPath??"/connect/app",C=t.walletUrl===void 0?"Choose another wallet or method":"Choose another method",R=d!==void 0&&(a||qt(n,d.walletUrl))?d.walletUrl:void 0,u=p?.walletUrl??t.walletUrl??R??n[0]?.url,b=p?.method??t.preferredMethod??d?.method??"phone";return new Promise((E,he)=>{let O=document.createElement("div");O.id="enbox-connect-modal";let ge=O.attachShadow({mode:"open"}),ct=document.createElement("style");ct.textContent=Dr,ge.appendChild(ct);let Z=document.createElement("div");Z.className="overlay";let k=document.createElement("div");k.className="modal",k.setAttribute("role","dialog"),k.setAttribute("aria-modal","true");let dt=a?`Reconnect to ${o}`:`Connect to ${o}`;k.setAttribute("aria-label",dt);let W=t.theme??{},ee=W.appearance??"auto";ee!=="auto"&&(k.dataset.appearance=ee);let Oe=window.matchMedia?.("(prefers-color-scheme: dark)"),sn=W.accent!==void 0||W.accentContrast!==void 0||W.light!==void 0||W.dark!==void 0,pt=()=>{let l=Oe?.matches===!0?"dark":"light",c=ee==="auto"?l:ee,v={accent:W.accent,accentContrast:W.accentContrast,...W[c]};for(let f of Object.keys(Ve)){let y=v[f];typeof y=="string"&&y.trim()!==""?k.style.setProperty(Ve[f],y):k.style.removeProperty(Ve[f])}},ut=()=>pt();sn&&(pt(),ee==="auto"&&Oe?.addEventListener?.("change",ut));let T=!1,L,ft,ve,We=!1,F,an=()=>F,ln=()=>{F=void 0},mt=new Map,z=[],te=l=>n.find(c=>c.url===l)??{name:Rr(l)??l,url:l},cn=()=>{if(u===void 0){z=n.slice(0,Ut);return}if(z.some(c=>c.url===u))return;let l=te(u);z=[l,...n.filter(c=>c.url!==l.url)].slice(0,Ut)},we=l=>{u=l,Y(),re()},dn=()=>{L?.cancel(),U(),document.removeEventListener("keydown",Et),document.removeEventListener("visibilitychange",xt),Oe?.removeEventListener?.("change",ut);try{O.remove()}catch{}},be=l=>{T||(T=!0,dn(),l())},ht=l=>{r&&u!==void 0&&(br(e.storage,{method:b,walletUrl:u}),xr(e.storage,{delegateDid:l.delegatePortableDid.uri,providerDid:l.connectedDid,method:b,walletUrl:u})),gn(),setTimeout(Ze(be,()=>E(l)),1200)},Ue=()=>be(()=>he(new Error("[@enbox/browser] Connect cancelled.")));k.appendChild(kr(dt,t.appIcon,Ue));let N=document.createElement("div");N.className="stage",N.setAttribute("aria-live","polite"),k.appendChild(N);let I=document.createElement("div");I.className="footer",k.appendChild(I);let _=(...l)=>{N.replaceChildren(...l),N.classList.remove("fade-in"),N.offsetWidth,N.classList.add("fade-in")},gt=l=>{_(m("div","spinner"),m("p","stage-caption",l))},pn=l=>{let c=L;setTimeout(()=>{T||c!==L||c?.active!==!0||F!==void 0||fn(l)},0)},vt=(l,c,v)=>{let f=document.createElement("a");return f.className=v,f.href=l.walletUri,f.target="_blank",f.rel="noopener noreferrer",f.addEventListener("click",()=>{pn(c)}),f},un=l=>{let c=u!==void 0?te(u):void 0,v=c?.name??"your wallet",f=vt(l,v,"qr-box qr-link");if(f.setAttribute("aria-label",`Open ${v} on this device`),f.replaceChildren(Ge(ze(l.walletUri),{dark:"#14141f",light:"transparent",quietZone:2})),c!==void 0){let y=m("div","qr-logo");y.appendChild(se(c)),f.appendChild(y)}if(s){let y=vt(l,v,"deep-link");c!==void 0&&y.appendChild(se(c)),y.appendChild(m("span","deep-link-label",`Continue in ${v}`)),f.classList.add("compact"),_(y,m("p","stage-subline",`${v} opens in a new tab \u2014 approve there, then come back for your code.`),m("div","stage-divider","or scan with another phone"),f);return}_(f,m("p","stage-caption","Scan with your phone\u2019s camera"),m("p","stage-subline",`${v} stays on your phone \u2014 or click the code to open it here.`))},fn=l=>{_(m("div","spinner"),m("p","stage-caption",`Finish in ${l}`),m("p","stage-subline",s?`Approve the connection in the ${l} tab, then come back here for your code.`:"Approve the connection in the tab that just opened, then come back here for your code."),j("Start over",()=>{Ee()}))},mn=()=>{let l=u!==void 0?te(u).name:"your wallet",c=document.createElement("div");c.className="claimed-pulse",_(c,m("p","stage-caption",`Request received \u2014 approve in ${l}`),m("p","stage-subline","Once you approve, you\u2019ll get a code to enter here."))},hn=(l,c)=>new Promise(v=>{F=v;let f=u!==void 0?te(u).name:"your wallet",y=document.createElement("div");y.className="pin-row",c!==void 0&&y.classList.add("shake");let q=Tr(y,an,ln,gt);_(m("p","stage-caption",`Enter the code shown in ${f}`),y,...c!==void 0?[m("p","stage-error",`That code doesn\u2019t match \u2014 check ${f}.`)]:[m("p","stage-subline",l===1?"This confirms you\u2019re the one approving.":"")]),q[0].focus()}),gn=()=>{let l=m("div","check");l.textContent="\u2713",_(l,m("p","stage-caption","You\u2019re connected."))},wt=()=>{_(m("p","stage-caption","No problem \u2014 nothing was shared."),Q("Start over",()=>{re()}),j("Close",Ze(be,()=>E(void 0))))},qe=()=>{p!==void 0&&(L?.cancel(),L=void 0,U(),Cr(e.storage,p.delegateDid,p.providerDid),p=void 0,t.walletUrl!==void 0&&(u=t.walletUrl),Y(),_(m("p","stage-caption","Choose another way to reconnect."),m("p","stage-subline","We\u2019ll still require the same wallet profile used for this session.")))},ye=(l,c)=>{_(m("p","stage-caption",l),Q("Start over",()=>{re()}),...p!==void 0?[j(C,qe)]:[],j("Close",Ze(be,()=>he(c??new Error(`[@enbox/browser] ${l}`)))))},vn=()=>{if(p!==void 0){_(m("p","stage-caption","Your saved wallet connection is unavailable right now."),m("p","stage-subline","Try again in a moment to reconnect the same session."),Q("Try again",()=>{Ee()}),j(C,qe));return}_(m("p","stage-caption","This wallet can\u2019t connect by phone here."),m("p","stage-subline","You can continue in this browser instead."),Q("Use this browser",()=>{xe()}))},ne=s?"tab":"window",wn=()=>{let l=u!==void 0?te(u).name:"your wallet",c=p!==void 0,f=c?`We\u2019ll open the same ${l} profile used for this session.`:s?"Your wallet opens in a new tab to approve this connection \u2014 no code needed.":"Your wallet opens in a small window to approve this connection.",q=c?`Open ${l} ${ne}`:s?"Open wallet":"Open wallet window";_(m("p","stage-caption",c?`Reconnect with ${l}`:"Connect with a wallet in this browser"),m("p","stage-subline",f),Q(q,()=>{xe()}))},bn=()=>{_(m("div","spinner"),m("p","stage-caption",`Finish in the wallet ${ne}`),m("p","stage-subline","We\u2019ll wrap up here as soon as you\u2019re done."))},yn=l=>{_(m("p","stage-caption",l?`Your browser blocked the wallet ${ne}.`:`The wallet ${ne} was closed.`),Q(l?"Open it now":`Reopen ${ne}`,()=>{xe()}),...p!==void 0?[j(C,qe)]:[j(s?"Use a code instead":"Use your phone instead",()=>{yt("phone")})])},En=l=>{if(T)return;let c=l instanceof Error?l:new Error(String(l)),v=/popup blocked/i.test(c.message);if(l instanceof H||v){yn(v);return}ye(/timed out/i.test(c.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",c)},xn=async l=>{if(t.connectServerUrl!==void 0)return t.connectServerUrl;let c=mt.get(l);return c===void 0&&(c=e.discoverConnectServerUrl(l),mt.set(l,c)),c},U=()=>{clearTimeout(ft),ve=void 0},bt=()=>{!T&&F===void 0&&b==="phone"&&Ee()},Cn=l=>{U();let c=Math.max(fr,l*1e3-ur);ve=Date.now()+c,ft=setTimeout(bt,c)},Ee=async()=>{if(L?.cancel(),U(),u===void 0){ye("No wallet is configured.");return}b="phone",Y(),gt("Getting things ready\u2026");let l=new URL(u).origin,c=await xn(l);if(c===void 0){vn();return}let v=_r();L=v;try{let f=await e.runRelay({connectServerUrl:c,walletUri:new URL(x,l).toString(),appName:o,appIcon:t.appIcon,applicationId:i,clientMetadata:Re(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.mode,expectedProviderDid:g,timeoutMs:t.timeout,cancelled:v.cancelled,onWalletUriReady:y=>{v.active&&!T&&(un(y),Cn(y.expiresIn))},onClaimed:()=>{v.active&&!T&&(U(),mn())},requestPin:(y,q)=>(U(),hn(y,q))});if(!v.active||T)return;f===void 0?wt():ht(f)}catch(f){if(!v.active||T||f instanceof J)return;let y=f instanceof Error?f:new Error(String(f));ye(/timed out/i.test(y.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",y)}},xe=async()=>{if(L?.cancel(),U(),u===void 0){ye("No wallet is configured.");return}if(!We){b="browser",Y(),We=!0,bn();try{let l=await e.runPopup({walletUrl:u,permissionRequests:t.permissionRequests,appName:o,appIcon:t.appIcon,applicationId:i,timeoutMs:t.timeout,delegatePortableDid:t.delegatePortableDid,requestType:t.mode,expectedProviderDid:g});if(T)return;l===void 0?wt():ht(l)}catch(l){En(l)}finally{We=!1}}},re=async()=>{b==="browser"?(L?.cancel(),U(),Y(),wn()):await Ee()},yt=async l=>{b=l,await re()},Y=()=>{if(I.replaceChildren(),p===void 0&&t.walletUrl===void 0){cn();let c=_n();c.label!==void 0&&I.appendChild(c.label),I.appendChild(c.row),I.appendChild(c.panel)}let l=document.createElement("div");if(l.className="footer-row",b==="phone"&&p===void 0){let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Or connect without a code \u2192":"No phone? Use this browser \u2192",c.addEventListener("click",()=>{xe()}),l.appendChild(c)}else if(b==="browser"&&p===void 0){let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Use a code instead \u2192":"Use your phone instead \u2192",c.addEventListener("click",()=>{yt("phone")}),l.appendChild(c)}l.childElementCount>0&&I.appendChild(l)},_n=()=>{let l=document.createElement("div");l.className="wallet-row",l.setAttribute("role","radiogroup"),l.setAttribute("aria-label","Wallet");for(let h of z){let w=document.createElement("button");w.className="row-tile",w.title=h.description??h.name,w.setAttribute("role","radio");let S=h.url===u;w.setAttribute("aria-checked",S?"true":"false"),S&&w.classList.add("selected"),w.appendChild(se(h)),w.appendChild(m("span","row-tile-name",h.name)),w.addEventListener("click",()=>{h.url!==u&&we(h.url)}),l.appendChild(w)}let c=document.createElement("div");c.className="wallet-panel",c.hidden=!0;let v=n.filter(h=>!qt(z,h.url)),f=document.createElement("button");f.className="row-tile more-tile",f.title="All wallets",f.setAttribute("aria-expanded","false"),f.appendChild(m("span","more-count",v.length>0?`+${v.length}`:"\u22EF")),f.appendChild(m("span","row-tile-name","More")),f.addEventListener("click",()=>{c.hidden=!c.hidden,f.setAttribute("aria-expanded",c.hidden?"false":"true"),c.hidden||Ie()}),l.appendChild(f);let y=z.length>0?m("div","wallet-row-label","Connecting with"):void 0,q=[],oe=document.createElement("div");if(oe.className="wallet-empty",oe.textContent="No other wallets match your search.",oe.hidden=!0,v.length>mr){let h=document.createElement("input");h.type="search",h.className="wallet-search",h.placeholder="Search wallets\u2026",h.setAttribute("aria-label","Search wallets"),h.addEventListener("input",()=>{let w=h.value.trim().toLowerCase(),S=0;for(let{wallet:_t,el:Pn}of q){let Pt=w===""||_t.name.toLowerCase().includes(w)||_t.url.toLowerCase().includes(w);Pn.hidden=!Pt,Pt&&(S+=1)}oe.hidden=S>0,Ie()}),c.appendChild(h)}let ie=document.createElement("div");ie.className="wallet-scroll-wrap",ie.hidden=v.length===0;let D=document.createElement("div");D.className="wallet-scroll";let Ne=document.createElement("div");Ne.className="wallet-grid";let Ie=()=>{let h=D.scrollHeight-D.clientHeight>1,w=D.scrollTop+D.clientHeight>=D.scrollHeight-1;ie.classList.toggle("scroll-hint",h&&!w)};D.addEventListener("scroll",Ie);for(let h of v){let w=document.createElement("button");w.className="wallet-tile",w.title=h.description??h.name,w.appendChild(se(h));let S=document.createElement("span");S.className="wallet-tile-name",S.textContent=h.name,w.appendChild(S),w.addEventListener("click",()=>{we(h.url)}),q.push({wallet:h,el:w}),Ne.appendChild(w)}D.appendChild(Ne),D.appendChild(oe),ie.appendChild(D),c.appendChild(ie);let Ce=document.createElement("div");Ce.className="wallet-custom";let M=document.createElement("input");M.className="url-input",M.type="url",M.placeholder="https://your-wallet.example";let A=document.createElement("button");A.className="url-go",A.textContent="Use";let B=document.createElement("div");B.className="url-error",B.hidden=!0;let Be=!1,Ct=async()=>{let h=M.value.trim();if(h==="")return;let w;try{w=new URL(h.includes("://")?h:`https://${h}`).origin}catch{M.classList.add("invalid");return}if(Be){we(w);return}A.disabled=!0,A.textContent="Checking\u2026",B.hidden=!0;let S=await e.validateWalletUrl(w);if(A.disabled=!1,S){A.textContent="Use",we(w);return}Be=!0,A.textContent="Use anyway",M.classList.add("invalid"),B.textContent=`Couldn't verify a wallet at ${w}.`,B.hidden=!1};return M.addEventListener("input",()=>{Be=!1,A.textContent="Use",M.classList.remove("invalid"),B.hidden=!0}),M.addEventListener("keydown",h=>{h.key==="Enter"&&Ct()}),A.addEventListener("click",()=>{Ct()}),Ce.appendChild(M),Ce.appendChild(A),c.appendChild(Ce),c.appendChild(B),{label:y,row:l,panel:c}};Z.addEventListener("click",l=>{l.target===Z&&Ue()});let Et=l=>{if(l.key==="Escape"){Ue();return}l.key==="Tab"&&Sr(ge,l)};document.addEventListener("keydown",Et);let xt=()=>{if(!(document.visibilityState!=="visible"||T)){if(ve!==void 0&&Date.now()>=ve){bt();return}F!==void 0&&Array.from(ge.querySelectorAll(".pin-input")).find(c=>c.value==="")?.focus()}};document.addEventListener("visibilitychange",xt),Z.appendChild(k),ge.appendChild(Z),document.body.appendChild(O),Y(),re()})}function qt(t,e){return t.some(n=>n.url===e)}function $t(t){if(typeof t!="string"||t.trim()==="")return!1;try{let e=new URL(t);return e.protocol==="http:"||e.protocol==="https:"}catch{return!1}}function Pr(t){return t.filter((e,n)=>t.findIndex(r=>r.url===e.url)===n)}function Rr(t){if(t!==void 0)try{return new URL(t).hostname}catch{return t}}function m(t,e,n){let r=document.createElement(t);return r.className=e,n!==void 0&&(r.textContent=n),r}function Q(t,e){let n=document.createElement("button");return n.className="stage-btn",n.textContent=t,n.addEventListener("click",e),n}function j(t,e){let n=document.createElement("button");return n.className="footer-link",n.textContent=t,n.addEventListener("click",e),n}function kr(t,e,n){let r=document.createElement("div");r.className="header";let o=document.createElement("div");if(o.className="header-identity",e!==void 0){let a=document.createElement("img");a.className="header-icon",a.src=e,a.alt="",a.width=24,a.height=24,a.addEventListener("error",()=>a.remove()),o.appendChild(a)}let i=document.createElement("h2");i.textContent=t,o.appendChild(i);let s=document.createElement("button");return s.className="close-btn",s.setAttribute("aria-label","Close"),s.textContent="\xD7",s.addEventListener("click",n),r.appendChild(o),r.appendChild(s),r}function Tr(t,e,n,r){let o=[];for(let s=0;s<Te;s++){let a=document.createElement("input");a.className="pin-input",a.type="text",a.inputMode="numeric",a.maxLength=1,a.setAttribute("aria-label",`Code digit ${s+1}`),o.push(a),t.appendChild(a)}let i=()=>{let s=o.map(d=>d.value).join(""),a=e();if(s.length===Te&&a!==void 0){let d=a;n(),r("Checking the code\u2026"),d(s)}};return o.forEach((s,a)=>{s.addEventListener("input",()=>{s.value=s.value.replace(/\D/g,"").slice(0,1),s.value!==""&&a+1<o.length&&o[a+1].focus(),i()}),s.addEventListener("keydown",d=>{d.key==="Backspace"&&s.value===""&&a>0&&o[a-1].focus()}),s.addEventListener("paste",d=>{let p=(d.clipboardData?.getData("text")??"").replace(/\D/g,"").slice(0,Te);p.length!==0&&(d.preventDefault(),p.split("").forEach((g,x)=>{o[x]!==void 0&&(o[x].value=g)}),o[Math.min(p.length,Te)-1]?.focus(),i())})}),o}function Sr(t,e){let n=Array.from(t.querySelectorAll('button, input, a[href], [tabindex]:not([tabindex="-1"])')).filter(s=>!s.hasAttribute("disabled")&&s.offsetParent!==null);if(n.length===0)return;let r=n[0],o=n[n.length-1],i=t.activeElement;e.shiftKey&&(i===r||i===null)?(e.preventDefault(),o.focus()):!e.shiftKey&&i===o&&(e.preventDefault(),r.focus())}var Nt=`
|
|
155
2
|
--ec-bg: #ffffff;
|
|
156
3
|
--ec-surface: #f5f6f8;
|
|
157
4
|
--ec-text: #17171f;
|
|
@@ -160,7 +7,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
|
|
|
160
7
|
--ec-accent: #0a62d0;
|
|
161
8
|
--ec-accent-contrast: #ffffff;
|
|
162
9
|
--ec-danger: #c0392b;
|
|
163
|
-
--ec-success: #1e9e5a;`,
|
|
10
|
+
--ec-success: #1e9e5a;`,It=`
|
|
164
11
|
--ec-bg: #181822;
|
|
165
12
|
--ec-surface: #23232f;
|
|
166
13
|
--ec-text: #e9e9f0;
|
|
@@ -169,7 +16,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
|
|
|
169
16
|
--ec-accent: #58a6ff;
|
|
170
17
|
--ec-accent-contrast: #0b1526;
|
|
171
18
|
--ec-danger: #ff7a7a;
|
|
172
|
-
--ec-success: #43d17c;`,
|
|
19
|
+
--ec-success: #43d17c;`,Dr=`
|
|
173
20
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
174
21
|
|
|
175
22
|
/* Keep the hidden attribute authoritative: author display values (e.g.
|
|
@@ -204,7 +51,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
|
|
|
204
51
|
50% { transform: scale(1); opacity: 1; }
|
|
205
52
|
}
|
|
206
53
|
|
|
207
|
-
.modal {${
|
|
54
|
+
.modal {${Nt}
|
|
208
55
|
--ec-accent-soft: color-mix(in srgb, var(--ec-accent) 14%, transparent);
|
|
209
56
|
background: var(--ec-bg);
|
|
210
57
|
color: var(--ec-text);
|
|
@@ -220,12 +67,12 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
|
|
|
220
67
|
flex-direction: column;
|
|
221
68
|
}
|
|
222
69
|
@media (prefers-color-scheme: dark) {
|
|
223
|
-
.modal {${
|
|
70
|
+
.modal {${It}
|
|
224
71
|
}
|
|
225
72
|
}
|
|
226
|
-
.modal[data-appearance='light'] {${
|
|
73
|
+
.modal[data-appearance='light'] {${Nt}
|
|
227
74
|
}
|
|
228
|
-
.modal[data-appearance='dark'] {${
|
|
75
|
+
.modal[data-appearance='dark'] {${It}
|
|
229
76
|
}
|
|
230
77
|
|
|
231
78
|
button, input { font-family: inherit; }
|
|
@@ -536,5 +383,158 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
|
|
|
536
383
|
.overlay, .modal, .stage.fade-in > *, .pin-row.shake { animation: none; }
|
|
537
384
|
.claimed-pulse::after { animation: none; }
|
|
538
385
|
}
|
|
539
|
-
`;var en=[{name:"Enbox",url:"https://enbox-wallet.pages.dev",description:"Manage your digital identity and data"},{name:"Prism",url:"https://prism-wallet.pages.dev",description:"A clear view into your digital identity"},{name:"Matcha",url:"https://matcha-wallet.pages.dev",description:"A fresh approach to digital identity"},{name:"Sumi",url:"https://sumi-wallet.pages.dev",description:"A refined home for your digital identity"},{name:"Taffy",url:"https://taffy-wallet.pages.dev",description:"A playful take on your digital identity"},{name:"Astoria",url:"https://astoria-wallet.pages.dev",description:"A grand home for your digital identity"},{name:"Quay",url:"https://quay-id.pages.dev",description:"A safe harbor for your digital identity"},{name:"Quoin",url:"https://quoin-id.pages.dev",description:"A cornerstone for your digital identity"}];function jr(t={}){let{wallets:e=en,walletUrl:n,timeout:r,appName:o,appIcon:i,applicationId:s,preferredMethod:a,rememberChoice:d,connectServerUrl:p,relayWalletPath:g,theme:x}=t;return{async requestAccess(C){let R=window.location.origin==="null"?window.location.href:window.location.origin;return rt({wallets:e,walletUrl:n,preferredMethod:a,rememberChoice:d,appName:o,appIcon:new URL(i??"/favicon.ico",R).href,applicationId:s,connectServerUrl:p,relayWalletPath:g,timeout:r,theme:x,mode:C.requestType,delegatePortableDid:C.delegatePortableDid,expectedProviderDid:C.expectedProviderDid,permissionRequests:C.permissionRequests})}}}import{X25519 as Hr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as $r,ConnectProvider as Kr}from"@enbox/connect";var Fr=3e5,zr=5e3,ot=class t{constructor(e){this._closed=!1;this._requestReceived=!1;this._requestSettled=!1;this._dappOrigin=e.dappOrigin,this._dappWindow=e.dappWindow,this._recipientPrivateKey=e.recipientPrivateKey;let n=Te();this._requestPromise=n.promise,this._resolveRequest=n.resolve,this._rejectRequest=n.reject,this._messageListener=r=>{this.onMessage(r)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.settleRequest(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 TypeError("[@enbox/browser] WalletPostMessageTransport is only available in browser environments.");let n=e.dappWindow??window.opener;if(!n)throw new Error("[@enbox/browser] No opener window: the DWeb Connect page must be opened as a popup by the dapp.");let r=Yr(e.dappOrigin),o=await Hr.generateKey(),i={kty:"OKP",crv:"X25519",x:o.x},s=new t({dappOrigin:r,dappWindow:n,recipientPrivateKey:o,timeoutMs:e.timeoutMs??Fr});try{n.postMessage({type:pe,walletEpk:i,walletOrigin:globalThis.location.origin},r)}catch(a){throw s.close(),a}return s}get dappOrigin(){return this._dappOrigin}async awaitRequest(){return await this._requestPromise}sendResponse(e){this.assertOpen();try{this.postResponse(e)}finally{this.close()}}async sendResponseAwaitingAck(e,n={}){if(this.assertOpen(),this._resolveAck!==void 0)throw new Error("[@enbox/browser] A connect response is already awaiting acknowledgement.");let r=new Promise(i=>{this._resolveAck=i}),o;try{return this.postResponse(e),o=setTimeout(()=>{this._resolveAck?.(!1)},n.timeoutMs??zr),await r}finally{clearTimeout(o),this.close()}}deny(){this.sendResponse($r)}close(){if(this._closed)return;this._closed=!0,clearTimeout(this._timeoutId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0),this._requestSettled||(this._requestSettled=!0,this._rejectRequest(new Error("[@enbox/browser] Wallet connect transport closed before receiving a request.")));let e=this._resolveAck;this._resolveAck=void 0,e?.(!1)}onMessage(e){if(this._closed)return;let n=De(e,this._dappOrigin,this._dappWindow);if(n!==void 0){if(n.type===me){this._resolveAck?.(!0);return}if(!(n.type!==ue||this._requestReceived)){if(this._requestReceived=!0,typeof n.jwe!="string"){this.settleRequest(new Error("[@enbox/browser] Connect request message did not carry a ciphertext payload."));return}this.openRequest(n.jwe)}}}async openRequest(e){try{let n=await Kr.openRequest({jwe:e,decryption:{mode:"ecdh-es",recipientPrivateKey:this._recipientPrivateKey,walletOrigin:globalThis.location.origin}});if(n.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(n)}catch(n){this.settleRequest(n instanceof Error?n:new Error(String(n)))}}settleRequest(e){if(!this._requestSettled){if(this._requestSettled=!0,clearTimeout(this._timeoutId),e instanceof Error){this.close(),this._rejectRequest(e);return}this._resolveRequest(e)}}assertOpen(){if(this._closed)throw new Error("[@enbox/browser] Wallet connect transport is closed.")}postResponse(e){this._dappWindow.postMessage({type:fe,payload:e},this._dappOrigin)}};function Yr(t){if(t!==void 0)return new URL(t).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.")}function Gr(t){if(!Number.isSafeInteger(t)||t<0||t>2147483647)throw new TypeError("delayMs must be an integer between 0 and 2147483647.")}var V=class{constructor(e,n){this._onEmpty=n;this._isRevoked=!1;this._references=0;this._releaseTimers=new Set;this.url=globalThis.URL.createObjectURL(e)}get references(){return this._references}acquire(){if(this._isRevoked)throw new Error("Object URL has been revoked.");this._references+=1;let e=!1,n,r=()=>{e||(e=!0,n!==void 0&&(clearTimeout(n),this._releaseTimers.delete(n)),!this._isRevoked&&(this._references-=1,this._references===0&&this._onEmpty(this)))};return Object.freeze({url:this.url,release:r,releaseAfter:o=>{Gr(o),!(e||this._isRevoked||n!==void 0)&&(n=setTimeout(r,o),this._releaseTimers.add(n))}})}revoke(){if(!this._isRevoked){this._isRevoked=!0;for(let e of this._releaseTimers)clearTimeout(e);this._releaseTimers.clear(),this._references=0,globalThis.URL.revokeObjectURL(this.url)}}};var it=class{constructor(){this._references=new Map;this._isDisposed=!1}acquire(e){if(this._isDisposed)throw new Error("BlobUrlPool is disposed.");let n=this._references.get(e);return n===void 0&&(n=new V(e,r=>{this._references.delete(e),r.revoke()}),this._references.set(e,n)),n.acquire()}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._references.values())e.revoke();this._references.clear()}}};function Jr(){return new it}var Qr=128*1024*1024,Xr=50;function tn(t,e){if(t!==1/0&&(!Number.isSafeInteger(t)||t<0))throw new TypeError(`${e} must be a non-negative safe integer or Infinity.`)}function st(t){throw t.abort(),t.signal.reason}var at=class{constructor(e){this._options=e;this._cache=new Map;this._entries=new Set;this._pending=new Map;this._bytes=0;this._generation=0;this._isDisposed=!1;this._maxBytes=e.maxBytes??Qr,this._maxEntries=e.maxEntries??Xr,tn(this._maxBytes,"maxBytes"),tn(this._maxEntries,"maxEntries")}async acquire(e){this._assertActive();let n=this._options.key(e),r=this._cache.get(n);if(r!==void 0)return this._acquire(r);let o=this._pending.get(n)??this._startRead(e,n),i=await o.promise;if(this._isDisposed||o.generation!==this._generation)return st(o.controller);if(i!==void 0)return this._cache.get(n)!==i?st(o.controller):this._acquire(i)}acquireCached(e){this._assertActive();let n=this._cache.get(this._options.key(e));return n===void 0?void 0:this._acquire(n)}invalidate(e){this._assertActive();let n=this._options.key(e);this._pending.get(n)?.controller.abort(),this._pending.delete(n);let o=this._cache.get(n);o!==void 0&&this._remove(o)}clear(){this._assertActive(),this._reset(!1)}dispose(){this._isDisposed||(this._isDisposed=!0,this._reset(!0))}_abortReads(){for(let e of this._pending.values())e.controller.abort();this._pending.clear()}_acquire(e){this._cache.delete(e.key),this._cache.set(e.key,e);let n=e.url.acquire();return this._evict(),Object.freeze({filename:e.filename,mimeType:e.mimeType,release:n.release,releaseAfter:n.releaseAfter,url:n.url})}_assertActive(){if(this._isDisposed)throw new Error("FileEnvelopeUrlStore is disposed.")}_assertCurrent(e,n,r){(this._isDisposed||n.signal.aborted||this._generation!==r||this._pending.get(e)?.controller!==n)&&st(n)}_evict(){for(;this._cache.size>this._maxEntries||this._bytes>this._maxBytes;){let e=[...this._cache.values()].find(n=>n.url.references===0);if(e===void 0)return;this._remove(e)}}async _load(e,n,r,o){let i=await this._options.read(e,r.signal);if(this._assertCurrent(n,r,o),i===void 0)return;let s=this._options.blobForUrl(i);this._assertCurrent(n,r,o);let a=new V(s,()=>this._released(d)),d={bytes:s.size,filename:i.filename,key:n,mimeType:i.mimeType,url:a};return this._cache.set(n,d),this._bytes+=d.bytes,this._entries.add(d),d}_released(e){this._cache.get(e.key)!==e?this._revoke(e):this._evict()}_remove(e){this._cache.get(e.key)===e&&(this._cache.delete(e.key),this._bytes-=e.bytes,e.url.references===0&&this._revoke(e))}_reset(e){this._generation+=1,this._abortReads(),this._cache.clear(),this._bytes=0;for(let n of this._entries)(e||n.url.references===0)&&this._revoke(n)}_revoke(e){e.url.revoke(),this._entries.delete(e)}_startRead(e,n){let r=new AbortController,o=this._generation,i=this._load(e,n,r,o).finally(()=>{this._pending.get(n)?.controller===r&&this._pending.delete(n)}),s={controller:r,generation:o,promise:i};return this._pending.set(n,s),s}};function Vr(t){return new at(t)}import{createProfileReader as si,isRetryableProfileReadStatus as ai}from"@enbox/protocols";import{DwnInterface as ci}from"@enbox/agent";import{DateSort as pi,DwnInterfaceName as ui,DwnMethodName as fi}from"@enbox/dwn-sdk-js";export{jr as BrowserConnectHandler,Fo as CONNECT_DENIED_TOKEN,zo as ConnectProvider,en as DEFAULT_WALLETS,me as DWEB_CONNECT_ACK_MESSAGE_TYPE,pe as DWEB_CONNECT_LOADED_MESSAGE_TYPE,$e as DWEB_CONNECT_PATH,ue as DWEB_CONNECT_REQUEST_MESSAGE_TYPE,fe as DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,pi as DateSort,ci as DwnInterface,ui as DwnInterfaceName,fi as DwnMethodName,Ve as MAX_PIN_ATTEMPTS,J as PopupClientTransport,$ as PopupWindowClosedError,Q as RelayConnectCancelledError,Kt as WALLET_WELL_KNOWN_PATH,ot as WalletPostMessageTransport,Ut as activatePolyfills,Tn as cacheResponse,ro as clearDrlCache,zn as connectViaPopup,Jr as createBlobUrlPool,Vr as createFileEnvelopeUrlStore,si as createProfileReader,no as deactivatePolyfills,Vt as discoverWalletConnectServerUrl,Ge as encodeQr,kn as fetchResource,Me as fetchWalletWellKnown,Lt as getDwnEndpoints,Rn as handleEvent,ai as isRetryableProfileReadStatus,se as parseDrlUrl,Un as prepareBrowser,Xe as probeWalletWellKnown,Qe as qrToSvg,rt as runConnectModal,Ze as runRelayConnect};
|
|
386
|
+
`;var Kt=[{name:"Enbox",url:"https://enbox-wallet.pages.dev",description:"Manage your digital identity and data"},{name:"Prism",url:"https://prism-wallet.pages.dev",description:"A clear view into your digital identity"},{name:"Matcha",url:"https://matcha-wallet.pages.dev",description:"A fresh approach to digital identity"},{name:"Sumi",url:"https://sumi-wallet.pages.dev",description:"A refined home for your digital identity"},{name:"Taffy",url:"https://taffy-wallet.pages.dev",description:"A playful take on your digital identity"},{name:"Astoria",url:"https://astoria-wallet.pages.dev",description:"A grand home for your digital identity"},{name:"Quay",url:"https://quay-id.pages.dev",description:"A safe harbor for your digital identity"},{name:"Quoin",url:"https://quoin-id.pages.dev",description:"A cornerstone for your digital identity"}];function nt(t={}){let{wallets:e=Kt,walletUrl:n,timeout:r,appName:o,appIcon:i,applicationId:s,preferredMethod:a,rememberChoice:d,connectServerUrl:p,relayWalletPath:g,theme:x}=t;return{async requestAccess(C){let R=window.location.origin==="null"?window.location.href:window.location.origin;return tt({wallets:e,walletUrl:n,preferredMethod:a,rememberChoice:d,appName:o,appIcon:new URL(i??"/favicon.ico",R).href,applicationId:s,connectServerUrl:p,relayWalletPath:g,timeout:r,theme:x,mode:C.requestType,delegatePortableDid:C.delegatePortableDid,expectedProviderDid:C.expectedProviderDid,permissionRequests:C.permissionRequests})}}}import{createConnectionStore as Mr,createApplication as Ft}from"@enbox/api";var zt=new WeakMap;function Ar(t){let e={stores:t.stores,...t.protocols===void 0?{}:{protocols:t.protocols}};if(typeof t.connection=="function"){if(t.wallet!==void 0||t.connectHandler!==void 0)throw new TypeError("createApplication: a native connection factory owns its connect handler.");return Ft({...e,connection:t.connection})}if(t.wallet!==void 0&&t.connectHandler!==void 0)throw new TypeError("createApplication: choose wallet options or a connectHandler.");for(let i of["application","connectHandler","auth","agent"])if(t.connection!==void 0&&Object.hasOwn(t.connection,i))throw new TypeError(`createApplication: connection.${i} is owned by the application.`);let n=t.connectHandler===void 0?Object.freeze({...t.wallet}):void 0,r=t.connectHandler??nt(n),o=Ft({...e,connection:i=>Mr({...t.connection,application:i,connectHandler:r})});return n!==void 0&&zt.set(o,n),o}function Lr(t){return zt.get(t)}export*from"@enbox/auth/browser";import{CONNECT_DENIED_TOKEN as ei,ConnectProvider as ti}from"@enbox/connect";import{createDidDhtMethod as Or,DidDht as Gt,DidResolverCacheMemory as Jt,DidWeb as Qt,resolveDwnEndpointStatus as Wr,UniversalResolver as Xt}from"@enbox/dids";function pe(t){let e=t.indexOf("://dweb/");if(e===-1)return null;let n=t.slice(0,e);if(n!=="http"&&n!=="https")return null;let r=t.slice(e+8);if(r.length===0)return null;let o=r.indexOf("/");return o===-1?[r,""]:o===0?null:[r.slice(0,o),r.slice(o+1)]}var rt=new Xt({didResolvers:[Gt,Qt],cache:new Jt});function Ur({didDhtNetwork:t,didResolvers:e}){if(e!==void 0&&t!==void 0)throw new Error("activatePolyfills: didDhtNetwork cannot be combined with didResolvers. Configure the resolver list directly.");if(e===void 0&&t===void 0)return;let n=t===void 0?Gt:Or(t);rt=new Xt({didResolvers:e??[n,Qt],cache:new Jt})}var Vt=/^http:/,Le=/\/$/,Zt="drl";async function en(t){let e=await Wr(t,rt);return e.status==="ready"?e.endpoints:[]}async function tn(){if(!(typeof caches>"u"))return caches.open(Zt)}async function qr(t,e,n,r){let o=t.request.url.replace(Vt,"https:").replace(Le,""),i=await tn(),s=await i?.match(o);if(s){if(!navigator.onLine)return s;let a=await r?.onCacheCheck?.(t,o);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 Nr(t,e,o,n,i,r);{let a=await rt.resolve(e);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 Nr(t,e,n,r,o,i){let s=await en(e);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 p=`${d.replace(Le,"")}/${e}/${r}`,g=await fetch(p,{headers:t.request.headers});if(g.ok)return await i?.onCacheCheck?.(t,n)&&o&&Ir(n,p,g,o),g;console.log(`DWN endpoint error: ${g.status}`),a=new Response("DWeb Node request failed",{status:g.status})}catch(p){console.log(`DWN endpoint error: ${p}`),a=new Response("DWeb Node request failed",{status:500})}return a}async function Ir(t,e,n,r){try{let o=n.clone(),i=new Headers(o.headers);i.append("dwn-cache-time",Date.now().toString()),i.append("dwn-composed-url",e);let s=new Response(o.body,{headers:i});await r.put(t,s)}catch(o){console.log(`Failed to cache DRL response: ${o}`)}}async function Br(t={}){try{if(typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope){let e=self;e.addEventListener("activate",n=>{n.waitUntil(e.clients.claim())}),e.addEventListener("fetch",n=>{let r=pe(n.request.url);r&&n.respondWith(qr(n,r[0],r[1],t))})}else if(globalThis?.navigator?.serviceWorker){if(!await navigator.serviceWorker.getRegistration("/")){let n=t.path||document?.currentScript?.src||import.meta.url;n&&navigator.serviceWorker.register(n,{type:"module"}).catch(r=>{console.error("DWeb networking feature installation failed: ",r)})}}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 nn=`
|
|
387
|
+
.drl-loading-overlay {
|
|
388
|
+
position: fixed;
|
|
389
|
+
inset: 0;
|
|
390
|
+
display: flex;
|
|
391
|
+
flex-wrap: wrap;
|
|
392
|
+
flex-direction: column;
|
|
393
|
+
align-items: center;
|
|
394
|
+
justify-content: center;
|
|
395
|
+
font-size: 22px;
|
|
396
|
+
color: #fff;
|
|
397
|
+
background: rgba(0, 0, 0, 0.75);
|
|
398
|
+
backdrop-filter: blur(15px);
|
|
399
|
+
-webkit-backdrop-filter: blur(15px);
|
|
400
|
+
z-index: 1000000;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.drl-loading-overlay > div {
|
|
404
|
+
display: flex;
|
|
405
|
+
align-items: center;
|
|
406
|
+
justify-content: center;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.drl-loading-spinner {
|
|
410
|
+
display: flex;
|
|
411
|
+
align-items: center;
|
|
412
|
+
justify-content: center;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.drl-loading-spinner div {
|
|
416
|
+
position: relative;
|
|
417
|
+
width: 2em;
|
|
418
|
+
height: 2em;
|
|
419
|
+
margin: 0.1em 0.25em 0 0;
|
|
420
|
+
}
|
|
421
|
+
.drl-loading-spinner div::after,
|
|
422
|
+
.drl-loading-spinner div::before {
|
|
423
|
+
content: '';
|
|
424
|
+
box-sizing: border-box;
|
|
425
|
+
width: 100%;
|
|
426
|
+
height: 100%;
|
|
427
|
+
border-radius: 50%;
|
|
428
|
+
border: 0.1em solid #FFF;
|
|
429
|
+
position: absolute;
|
|
430
|
+
left: 0;
|
|
431
|
+
top: 0;
|
|
432
|
+
opacity: 0;
|
|
433
|
+
animation: drl-loading-spinner 2s linear infinite;
|
|
434
|
+
}
|
|
435
|
+
.drl-loading-spinner div::after {
|
|
436
|
+
animation-delay: 1s;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.drl-loading-overlay span {
|
|
440
|
+
--text-opacity: 2;
|
|
441
|
+
display: flex;
|
|
442
|
+
align-items: center;
|
|
443
|
+
margin: 2em auto 0;
|
|
444
|
+
padding: 0.2em 0.75em 0.25em;
|
|
445
|
+
text-align: center;
|
|
446
|
+
border-radius: 5em;
|
|
447
|
+
background: rgba(255 255 255 / 8%);
|
|
448
|
+
opacity: 0.8;
|
|
449
|
+
transition: opacity 0.3s ease;
|
|
450
|
+
cursor: pointer;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.drl-loading-overlay span:focus {
|
|
454
|
+
opacity: 1;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.drl-loading-overlay span:hover {
|
|
458
|
+
opacity: 1;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
.drl-loading-overlay span::before {
|
|
462
|
+
content: '\u2715 ';
|
|
463
|
+
margin: 0 0.4em 0 0;
|
|
464
|
+
color: red;
|
|
465
|
+
font-size: 65%;
|
|
466
|
+
font-weight: bold;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.drl-loading-overlay span::after {
|
|
470
|
+
content: 'stop';
|
|
471
|
+
display: block;
|
|
472
|
+
font-size: 60%;
|
|
473
|
+
line-height: 0;
|
|
474
|
+
color: rgba(255 255 255 / 60%);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.drl-loading-overlay.new-tab-overlay span::after {
|
|
478
|
+
content: 'close';
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
@keyframes drl-loading-spinner {
|
|
482
|
+
0% {
|
|
483
|
+
transform: scale(0);
|
|
484
|
+
opacity: 1;
|
|
485
|
+
}
|
|
486
|
+
100% {
|
|
487
|
+
transform: scale(1);
|
|
488
|
+
opacity: 0;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
`,Hr=`
|
|
492
|
+
<!DOCTYPE html>
|
|
493
|
+
<html lang='en'>
|
|
494
|
+
<head>
|
|
495
|
+
<meta charset='UTF-8'>
|
|
496
|
+
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
|
|
497
|
+
<title>Loading DRL...</title>
|
|
498
|
+
<style>
|
|
499
|
+
html, body {
|
|
500
|
+
background-color: #151518;
|
|
501
|
+
height: 100%;
|
|
502
|
+
margin: 0;
|
|
503
|
+
padding: 0;
|
|
504
|
+
font-family: Arial, sans-serif;
|
|
505
|
+
text-align: center;
|
|
506
|
+
}
|
|
507
|
+
${nn}
|
|
508
|
+
</style>
|
|
509
|
+
</head>
|
|
510
|
+
<body>
|
|
511
|
+
<div class='drl-loading-overlay new-tab-overlay'>
|
|
512
|
+
<div class='drl-loading-spinner'>
|
|
513
|
+
<div></div>
|
|
514
|
+
Loading DRL
|
|
515
|
+
</div>
|
|
516
|
+
<span onclick='window.close()' tabindex='0'></span>
|
|
517
|
+
</div>
|
|
518
|
+
</body>
|
|
519
|
+
</html>
|
|
520
|
+
`,De=!1,$=null,ue=null;function Yt(){De||(ue=document.createElement("style"),ue.innerHTML=`
|
|
521
|
+
${nn}
|
|
522
|
+
|
|
523
|
+
.drl-loading-overlay {
|
|
524
|
+
opacity: 0;
|
|
525
|
+
transition: opacity 0.3s ease;
|
|
526
|
+
pointer-events: none;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
:root[drl-link-loading] .drl-loading-overlay {
|
|
530
|
+
opacity: 1;
|
|
531
|
+
pointer-events: all;
|
|
532
|
+
}
|
|
533
|
+
`,document.head.append(ue),$=document.createElement("div"),$.classList.add("drl-loading-overlay"),$.innerHTML=`
|
|
534
|
+
<div class='drl-loading-spinner'>
|
|
535
|
+
<div></div>
|
|
536
|
+
Loading DRL
|
|
537
|
+
</div>
|
|
538
|
+
<span tabindex='0'></span>
|
|
539
|
+
`,$.lastElementChild.addEventListener("click",ot),document.body.prepend($),De=!0)}function jr(){De&&(ue?.remove(),ue=null,$?.remove(),$=null,De=!1)}function ot(){document.documentElement.removeAttribute("drl-link-loading"),Me=null}async function $r(t,e,n){let r=null;n?(r=window.open("","_blank"),r&&r.document.write(Hr)):(Me=e,setTimeout(()=>document.documentElement.setAttribute("drl-link-loading",""),50));let o=await en(t);if(!o.length)throw new Error("no valid DWN endpoints found");let i=`${o[0].replace(Le,"")}/${t}/${e}`;n?r&&!r.closed&&(r.location.href=i):Me===e&&(window.location.href=i)}var Me=null,Ae=!1,fe=null,me=null;function Kr(){Ae||(fe=async t=>{let e=t.target?.closest("a");if(!e)return;let n=e.href,r=pe(n);if(!r)return;let o=r[0],i=r[1],s=e.target==="_blank";t.preventDefault();try{await $r(o,i,s)}catch{throw Me===i&&ot(),new Error(`DID endpoint resolution failed for the DRL: ${n}`)}},me=async t=>{let e=t.composedPath()[0];if(t.pointerType==="mouse"&&t.button===2||t.pointerType==="touch"&&t.isPrimary){if(X(),e?.src&&pe(e.src)){K=e,e.__src__=e.src;let n=e.src.replace(Vt,"https:").replace(Le,""),o=await(await tn())?.match(n);if(o){let i=o.headers.get("dwn-composed-url");i&&(e.src=i)}e.addEventListener("pointerup",X,{once:!0})}}else e===K&&X()},document.addEventListener("click",fe),document.addEventListener("pointercancel",X),document.addEventListener("pointerdown",me),Ae=!0)}function Fr(){Ae&&(fe&&(document.removeEventListener("click",fe),fe=null),me&&(document.removeEventListener("pointerdown",me),me=null),document.removeEventListener("pointercancel",X),X(),ot(),Ae=!1)}var K=null;async function X(t){t?.type==="pointerup"&&await new Promise(e=>requestAnimationFrame(()=>e())),K&&(K.src=K.__src__,delete K.__src__,K=null)}function rn(t={}){Ur(t),t.serviceWorker!==!1&&Br(t),typeof window<"u"&&typeof window.document<"u"&&(t.injectStyles!==!1&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Yt,{once:!0}):Yt()),t.links!==!1&&Kr())}function Lo(){typeof window<"u"&&typeof window.document<"u"&&(Fr(),jr())}async function Oo(){return typeof caches>"u"?!1:caches.delete(Zt)}async function zr(t,e={}){let{signal:n,timeoutMs:r=2e4}=e;if(n?.throwIfAborted(),!Number.isFinite(r)||r<0||r>2147483647)throw new RangeError("prepareBrowser: timeoutMs must be between 0 and 2147483647 milliseconds.");if(typeof window>"u"||!("serviceWorker"in navigator))throw new Error("prepareBrowser: service workers are unavailable in this page.");let o=navigator.serviceWorker,i=typeof t=="string"||"href"in t?new URL(t,document.baseURI):void 0;i!==void 0&&(i.hash="");let s=await new Promise((a,d)=>{let p,g=!1,x=()=>{g=!0,clearTimeout(b),o.removeEventListener("controllerchange",R),n?.removeEventListener("abort",u)},C=E=>{g||(x(),d(E))},R=()=>{let E=o.controller;g||p===void 0||E===null||E!==p.active||i!==void 0&&E.scriptURL!==i.href||(x(),a(p))},u=()=>C(n?.reason),b=setTimeout(()=>{C(new DOMException("The application service worker did not take control before the timeout.","TimeoutError"))},r);o.addEventListener("controllerchange",R),n?.addEventListener("abort",u,{once:!0});try{n?.throwIfAborted(),i===void 0?(p=t,R()):o.register(i.href,e.registrationOptions).then(E=>{g||(p=E,R())},C)}catch(E){C(E)}});return n?.throwIfAborted(),rn({...e.polyfills,serviceWorker:!1}),s}import{X25519 as Yr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as Gr,ConnectProvider as Jr}from"@enbox/connect";var Qr=3e5,Xr=5e3,it=class t{constructor(e){this._closed=!1;this._requestReceived=!1;this._requestSettled=!1;this._dappOrigin=e.dappOrigin,this._dappWindow=e.dappWindow,this._recipientPrivateKey=e.recipientPrivateKey;let n=_e();this._requestPromise=n.promise,this._resolveRequest=n.resolve,this._rejectRequest=n.reject,this._messageListener=r=>{this.onMessage(r)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.settleRequest(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 TypeError("[@enbox/browser] WalletPostMessageTransport is only available in browser environments.");let n=e.dappWindow??window.opener;if(!n)throw new Error("[@enbox/browser] No opener window: the DWeb Connect page must be opened as a popup by the dapp.");let r=Vr(e.dappOrigin),o=await Yr.generateKey(),i={kty:"OKP",crv:"X25519",x:o.x},s=new t({dappOrigin:r,dappWindow:n,recipientPrivateKey:o,timeoutMs:e.timeoutMs??Qr});try{n.postMessage({type:ae,walletEpk:i,walletOrigin:globalThis.location.origin},r)}catch(a){throw s.close(),a}return s}get dappOrigin(){return this._dappOrigin}async awaitRequest(){return await this._requestPromise}sendResponse(e){this.assertOpen();try{this.postResponse(e)}finally{this.close()}}async sendResponseAwaitingAck(e,n={}){if(this.assertOpen(),this._resolveAck!==void 0)throw new Error("[@enbox/browser] A connect response is already awaiting acknowledgement.");let r=new Promise(i=>{this._resolveAck=i}),o;try{return this.postResponse(e),o=setTimeout(()=>{this._resolveAck?.(!1)},n.timeoutMs??Xr),await r}finally{clearTimeout(o),this.close()}}deny(){this.sendResponse(Gr)}close(){if(this._closed)return;this._closed=!0,clearTimeout(this._timeoutId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0),this._requestSettled||(this._requestSettled=!0,this._rejectRequest(new Error("[@enbox/browser] Wallet connect transport closed before receiving a request.")));let e=this._resolveAck;this._resolveAck=void 0,e?.(!1)}onMessage(e){if(this._closed)return;let n=Pe(e,this._dappOrigin,this._dappWindow);if(n!==void 0){if(n.type===de){this._resolveAck?.(!0);return}if(!(n.type!==le||this._requestReceived)){if(this._requestReceived=!0,typeof n.jwe!="string"){this.settleRequest(new Error("[@enbox/browser] Connect request message did not carry a ciphertext payload."));return}this.openRequest(n.jwe)}}}async openRequest(e){try{let n=await Jr.openRequest({jwe:e,decryption:{mode:"ecdh-es",recipientPrivateKey:this._recipientPrivateKey,walletOrigin:globalThis.location.origin}});if(n.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(n)}catch(n){this.settleRequest(n instanceof Error?n:new Error(String(n)))}}settleRequest(e){if(!this._requestSettled){if(this._requestSettled=!0,clearTimeout(this._timeoutId),e instanceof Error){this.close(),this._rejectRequest(e);return}this._resolveRequest(e)}}assertOpen(){if(this._closed)throw new Error("[@enbox/browser] Wallet connect transport is closed.")}postResponse(e){this._dappWindow.postMessage({type:ce,payload:e},this._dappOrigin)}};function Vr(t){if(t!==void 0)return new URL(t).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.")}function Zr(t){if(!Number.isSafeInteger(t)||t<0||t>2147483647)throw new TypeError("delayMs must be an integer between 0 and 2147483647.")}var V=class{constructor(e,n){this._onEmpty=n;this._isRevoked=!1;this._references=0;this._releaseTimers=new Set;this.url=globalThis.URL.createObjectURL(e)}get references(){return this._references}acquire(){if(this._isRevoked)throw new Error("Object URL has been revoked.");this._references+=1;let e=!1,n,r=()=>{e||(e=!0,n!==void 0&&(clearTimeout(n),this._releaseTimers.delete(n)),!this._isRevoked&&(this._references-=1,this._references===0&&this._onEmpty(this)))};return Object.freeze({url:this.url,release:r,releaseAfter:o=>{Zr(o),!(e||this._isRevoked||n!==void 0)&&(n=setTimeout(r,o),this._releaseTimers.add(n))}})}revoke(){if(!this._isRevoked){this._isRevoked=!0;for(let e of this._releaseTimers)clearTimeout(e);this._releaseTimers.clear(),this._references=0,globalThis.URL.revokeObjectURL(this.url)}}};var st=class{constructor(){this._references=new Map;this._isDisposed=!1}acquire(e){if(this._isDisposed)throw new Error("BlobUrlPool is disposed.");let n=this._references.get(e);return n===void 0&&(n=new V(e,r=>{this._references.delete(e),r.revoke()}),this._references.set(e,n)),n.acquire()}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._references.values())e.revoke();this._references.clear()}}};function eo(){return new st}var to=128*1024*1024,no=50;function on(t,e){if(t!==1/0&&(!Number.isSafeInteger(t)||t<0))throw new TypeError(`${e} must be a non-negative safe integer or Infinity.`)}function at(t){throw t.abort(),t.signal.reason}var lt=class{constructor(e){this._options=e;this._cache=new Map;this._entries=new Set;this._pending=new Map;this._bytes=0;this._generation=0;this._isDisposed=!1;this._maxBytes=e.maxBytes??to,this._maxEntries=e.maxEntries??no,on(this._maxBytes,"maxBytes"),on(this._maxEntries,"maxEntries")}async acquire(e){this._assertActive();let n=this._options.key(e),r=this._cache.get(n);if(r!==void 0)return this._acquire(r);let o=this._pending.get(n)??this._startRead(e,n),i=await o.promise;if(this._isDisposed||o.generation!==this._generation)return at(o.controller);if(i!==void 0)return this._cache.get(n)!==i?at(o.controller):this._acquire(i)}acquireCached(e){this._assertActive();let n=this._cache.get(this._options.key(e));return n===void 0?void 0:this._acquire(n)}invalidate(e){this._assertActive();let n=this._options.key(e);this._pending.get(n)?.controller.abort(),this._pending.delete(n);let o=this._cache.get(n);o!==void 0&&this._remove(o)}clear(){this._assertActive(),this._reset(!1)}dispose(){this._isDisposed||(this._isDisposed=!0,this._reset(!0))}_abortReads(){for(let e of this._pending.values())e.controller.abort();this._pending.clear()}_acquire(e){this._cache.delete(e.key),this._cache.set(e.key,e);let n=e.url.acquire();return this._evict(),Object.freeze({filename:e.filename,mimeType:e.mimeType,release:n.release,releaseAfter:n.releaseAfter,url:n.url})}_assertActive(){if(this._isDisposed)throw new Error("FileEnvelopeUrlStore is disposed.")}_assertCurrent(e,n,r){(this._isDisposed||n.signal.aborted||this._generation!==r||this._pending.get(e)?.controller!==n)&&at(n)}_evict(){for(;this._cache.size>this._maxEntries||this._bytes>this._maxBytes;){let e=[...this._cache.values()].find(n=>n.url.references===0);if(e===void 0)return;this._remove(e)}}async _load(e,n,r,o){let i=await this._options.read(e,r.signal);if(this._assertCurrent(n,r,o),i===void 0)return;let s=this._options.blobForUrl(i);this._assertCurrent(n,r,o);let a=new V(s,()=>this._released(d)),d={bytes:s.size,filename:i.filename,key:n,mimeType:i.mimeType,url:a};return this._cache.set(n,d),this._bytes+=d.bytes,this._entries.add(d),d}_released(e){this._cache.get(e.key)!==e?this._revoke(e):this._evict()}_remove(e){this._cache.get(e.key)===e&&(this._cache.delete(e.key),this._bytes-=e.bytes,e.url.references===0&&this._revoke(e))}_reset(e){this._generation+=1,this._abortReads(),this._cache.clear(),this._bytes=0;for(let n of this._entries)(e||n.url.references===0)&&this._revoke(n)}_revoke(e){e.url.revoke(),this._entries.delete(e)}_startRead(e,n){let r=new AbortController,o=this._generation,i=this._load(e,n,r,o).finally(()=>{this._pending.get(n)?.controller===r&&this._pending.delete(n)}),s={controller:r,generation:o,promise:i};return this._pending.set(n,s),s}};function ro(t){return new lt(t)}import{createProfileReader as hi,isRetryableProfileReadStatus as gi}from"@enbox/protocols";import{DwnInterface as wi}from"@enbox/agent";import{DateSort as yi,DwnInterfaceName as Ei,DwnMethodName as xi}from"@enbox/dwn-sdk-js";export{nt as BrowserConnectHandler,ei as CONNECT_DENIED_TOKEN,ti as ConnectProvider,Kt as DEFAULT_WALLETS,de as DWEB_CONNECT_ACK_MESSAGE_TYPE,ae as DWEB_CONNECT_LOADED_MESSAGE_TYPE,He as DWEB_CONNECT_PATH,le as DWEB_CONNECT_REQUEST_MESSAGE_TYPE,ce as DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,yi as DateSort,wi as DwnInterface,Ei as DwnInterfaceName,xi as DwnMethodName,Qe as MAX_PIN_ATTEMPTS,G as PopupClientTransport,H as PopupWindowClosedError,J as RelayConnectCancelledError,Ot as WALLET_WELL_KNOWN_PATH,it as WalletPostMessageTransport,rn as activatePolyfills,Ir as cacheResponse,Oo as clearDrlCache,Un as connectViaPopup,Ar as createApplication,eo as createBlobUrlPool,ro as createFileEnvelopeUrlStore,hi as createProfileReader,Lo as deactivatePolyfills,jt as discoverWalletConnectServerUrl,ze as encodeQr,Nr as fetchResource,ke as fetchWalletWellKnown,Lr as getApplicationWalletOptions,en as getDwnEndpoints,qr as handleEvent,gi as isRetryableProfileReadStatus,pe as parseDrlUrl,zr as prepareBrowser,Je as probeWalletWellKnown,Ge as qrToSvg,tt as runConnectModal,Xe as runRelayConnect};
|
|
540
540
|
//# sourceMappingURL=browser.mjs.map
|