1import{n as e,t}from"./sync-wire-O_oTp2Oy.js";import{r as n,t as r}from"./noise-js-Crku9Lwa.js";var i=1e4;function a(e){if(e.length%2!=0)throw Error(`invalid hex`);let t=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)t[n/2]=parseInt(e.slice(n,n+2),16);return t}function o(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/g,``)}function s(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(Math.ceil(e.length/4)*4,`=`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e+=1)r[e]=n.charCodeAt(e);return r}async function c(e,t,c){if(e.wsPort===void 0)throw Error(`peer did not advertise a WebSocket port`);let l=`ws://${e.host}:${e.wsPort}/`,u=await new Promise((e,t)=>{let n=new WebSocket(l);n.binaryType=`arraybuffer`;let r=setTimeout(()=>{try{n.close()}catch{}t(Error(`WebSocket open timeout`))},i);n.addEventListener(`open`,()=>{clearTimeout(r),e(n)}),n.addEventListener(`error`,()=>{clearTimeout(r),t(Error(`Cannot connect to ${l}`))})}),d=[],f=null,p=null,m=!1,h=null;u.addEventListener(`message`,e=>{let t=new Uint8Array(e.data);if(f){let e=f;f=null,p=null,e(t)}else d.push(t)}),u.addEventListener(`close`,()=>{if(m=!0,p){let e=p;f=null,p=null,e(Error(`WebSocket closed during handshake`))}}),u.addEventListener(`error`,()=>{if(h=`websocket_error`,p){let e=p;f=null,p=null,e(Error(`WebSocket error`))}});function g(e){if(m)return Promise.reject(Error(`WebSocket closed`));let t=new Uint8Array(e);return u.send(t.buffer),Promise.resolve()}function _(){return d.length>0?Promise.resolve(d.shift()):m?Promise.reject(Error(`WebSocket closed`)):new Promise((e,t)=>{f=e,p=t})}let v=a(e.x25519PublicKey),y=await r(v,g,_);await n(y,t,c,v,async e=>{await g(y.encrypt(e))},async()=>y.decrypt(await _()));let b=[],x=[],S=[];return u.addEventListener(`message`,e=>{try{let t=new Uint8Array(e.data),n=o(y.decrypt(t));for(let e of b)e(n)}catch(e){let t=e instanceof Error?e.message:String(e);for(let e of x)e(t)}}),u.addEventListener(`close`,()=>{for(let e of S)e()}),u.addEventListener(`error`,()=>{let e=h||`websocket_error`;for(let t of x)t(e)}),{send:async e=>{let t=s(e);await g(y.encrypt(t))},onFrame:e=>(b.push(e),()=>{let t=b.indexOf(e);t>=0&&b.splice(t,1)}),onError:e=>(x.push(e),()=>{let t=x.indexOf(e);t>=0&&x.splice(t,1)}),onClose:e=>(S.push(e),()=>{let t=S.indexOf(e);t>=0&&S.splice(t,1)}),close:()=>{try{u.close()}catch{}}}}var l=3e4;async function u(n,r,i,a,o){let s=await c(n,r,i);try{let n=new Promise((e,n)=>{let r=setTimeout(()=>{c(),n(Error(`pairing response timeout`))},l),i=s.onFrame(r=>{try{let n=t(r);c(),e(n)}catch(e){c(),n(e instanceof Error?e:Error(String(e)))}}),a=s.onError(e=>{c(),n(Error(e))}),o=s.onClose(()=>{c(),n(Error(`connection closed before pairing response`))});function c(){clearTimeout(r),i(),a(),o()}});await s.send(e({type:`PAIR_REQUEST`,public_key_hex:a,device_name:o}));let r=await n;if(r.type===`PAIR_ACCEPT`)return{publicKeyHex:r.public_key_hex,deviceName:r.device_name};throw r.type===`PAIR_REJECT`?Error(`pair_rejected:${r.reason}`):Error(`unexpected_response:${r.type}`)}finally{try{s.close()}catch{}}}export{u as runCapacitorPairingHandshake};