@appetize/cli 0.25.1 → 0.27.0

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.
@@ -1,4 +0,0 @@
1
- import Je from"debug";import{JSONRPCServerAndClient as Cr,JSONRPCServer as Pr,JSONRPCClient as _r,JSONRPC as Nr}from"json-rpc-2.0";import*as m from"zod/mini";import{writeFileSync as Dr,renameSync as Br,mkdirSync as Mt,readFileSync as zr,rmSync as Fr,readdirSync as jr}from"node:fs";import{sep as $r,join as ie}from"node:path";import{homedir as Ut}from"node:os";import{Transform as Vr}from"stream";import{createRequire as Kr}from"module";import{connect as qr}from"node:net";class Wr extends Event{code;reason;wasClean;constructor(e,r={}){super(e,r),this.code=r.code??0,this.reason=r.reason??"",this.wasClean=r.wasClean??!1}}function Jr(t,e){const r="CloseEvent"in globalThis?globalThis.CloseEvent:Wr;return new r(t,e)}class Gr{#e=new EventTarget;addEventListener(e,r,s){return this.#e.addEventListener(e,r,s),()=>{this.#e.removeEventListener(e,r,s)}}removeEventListener(e,r,s){this.#e.removeEventListener(e,r,s)}dispatchEvent(e){return this.#e.dispatchEvent(e)}}const U=Symbol.for("@appetizeio/rpc:rpcMethods");class Hr extends Gr{send;constructor(e){super(),this.send=e}dispatchClose(e){return this.dispatchEvent(Jr("close",e))}dispatchMessage(e){return this.dispatchEvent(new CustomEvent("message",{detail:e}))}}const Zr="@appetizeio/rpc:playwrightAdapter";class ve{closed=!1;[U];#e;constructor(e,{signal:r}={}){this[U]=new Hr(e),this.#e=r,this.#e?.addEventListener("abort",this.#t)}close(e={}){this.closed||(this.closed=!0,this.handleClose(e))}handleClose(e){this.#e?.removeEventListener("abort",this.#t),this[U].dispatchClose(e)}#t=()=>{this.close({code:1e3,reason:String(this.#e?.reason)})}}const Pe=Symbol.for(Zr);function Yr(t){window[Pe]&&console.warn("playwright exposed more than once, overwriting previous adapter");const e={send(r){t[U].send(r)},subscribe(r){return t[U].addEventListener("message",s=>{r(s.detail)})}};return window[Pe]=e,()=>{window[Pe]===e&&delete window[Pe]}}const Lt=Je("appetize.io:error:rpc");function Ge(t,e){const r=new Cr(new Pr({errorListener:Lt}),Qr(t),{errorListener:Lt}),s=t[U].addEventListener("message",({detail:i})=>{r.receiveAndSend(i)}),n=t[U].addEventListener("close",()=>{s(),r.rejectAllPendingRequests("Transport closed")},{once:!0});for(const i in e){const l=e[i];l&&r.addMethod(i,l.bind(e))}return{rpc:r,unsub:()=>{s(),n()}}}function Ct(t,e){const{rpc:r,unsub:s}=Ge(t,e);return{client:r.client,unsub:s}}function _e(t,e){const r=t[U].addEventListener("message",({detail:n})=>{if("method"in n)try{e({method:n.method,param:n.params})}catch{}}),s=t[U].addEventListener("close",r,{once:!0});return()=>{r(),s()}}function Qr(t){return new _r(t[U].send.bind(t[U]),()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)+1)}function He(t,e,{leftEffects:r=()=>({}),notifiesLeft:s,notifiesRight:n,rightEffects:i=()=>({})}={}){const l=Ge(t,{}),y=Ge(e,{}),p=[()=>{l.unsub(),y.unsub()}],A=()=>{for(const _ of p)try{_()}catch{}},E=y.rpc.client,R=l.rpc.client;p.push(t[U].addEventListener("close",()=>{A()},{once:!0}),e[U].addEventListener("close",()=>{A()},{once:!0}));const M=r(E,R);for(const _ in M){const C=M[_];C&&l.rpc.addMethod(_,C)}const N=i(R,E);for(const _ in N){const C=N[_];C&&y.rpc.addMethod(_,C)}return Pt(l.rpc,y.rpc,{notifies:s}),Pt(y.rpc,l.rpc,{notifies:n}),A}function Pt(t,e,{notifies:r}={}){t.applyServerMiddleware(async(s,n)=>{const i=r?.();if(i){const{id:y,...p}=n;i[U].send(p)}if(t.hasMethod(n.method))return await s(n);if(!n.id)return e.notify(n.method,n.params),null;const l=await e.request(n.method,n.params);return{id:n.id,jsonrpc:Nr,result:l}})}function ee(t,...e){t.notify(e[0],e[1],e[2])}const Xr=(...t)=>Ct(...t),es=["h264","jpeg"],Ze=["ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backspace","Enter","Tab"],_t=["landscapeLeft","landscapeRight","portrait","upsideDown"];function Ye(){const t=new ve(async r=>{e[U].dispatchMessage(r)}),e=new ve(async r=>{t[U].dispatchMessage(r)});return t[U].addEventListener("close",()=>{e.close()},{once:!0}),e[U].addEventListener("close",()=>{t.close()},{once:!0}),[t,e]}function Nt(t,e){const r=[],s=()=>{for(const n of r)n()};r.push(t[U].addEventListener("message",n=>e[U].send(n.detail))),r.push(t[U].addEventListener("close",s,{once:!0})),r.push(e[U].addEventListener("message",n=>t[U].send(n.detail))),r.push(e[U].addEventListener("close",s,{once:!0}))}function Qe(t){return!!t&&typeof t=="object"&&"jsonrpc"in t}const oe=Je("appetize.io:trace:transport:iframe");class Dt extends ve{onmessage;#e;#t;constructor(e,{origin:r="*",signal:s}={}){super(async n=>{e.postMessage(n,this.#e)},{signal:s}),this.#t=e,this.#e=r,window.addEventListener("message",this.#r)}postMessage(e,r,s){oe("postMessage(legacy)",{message:e,targetOrigin:r,transfer:s}),this.#t.postMessage(e,r??this.#e,s)}handleClose(e){oe("close()"),window.removeEventListener("message",this.#r),super.handleClose(e)}#r=async e=>{if(oe("handleMessage()",e),e.source!==this.#t||(oe("handleMessage() -> source ok"),this.#e!=="*"&&e.origin!==this.#e))return;oe("handleMessage() -> origin ok");const r=e.data;if(!Qe(r)){oe("handleMessage() -> legacy"),this.onmessage?.(e);return}oe("handleMessage() -> jsonrpc"),this[U].dispatchMessage(r)}}function Ne(){let t,e;return{promise:new Promise((s,n)=>{e=s,t=n}),reject:t,resolve:e}}const ts=2*1024*1024,Bt=Je("appetize:client:acked-writable-stream");class rs{unacked=0;#e;#t;#r;#s;#n=[];#o;constructor(e){this.#r=e,this.#o=e.window??ts}abort(e){this.#i(e),this.#r.onAbort?.(e)}async close(){await this.#c(()=>this.unacked===0),this.#r.onClose?.()}fail(e){this.#i(e)&&this.#r.onError?.(e)}start(e){this.#e=e}write(e){const r=e.byteLength;return this.unacked+=r,this.#r.send(e).then(()=>{this.unacked-=r,this.#s&&(this.#s.acked+=r),this.#a()},s=>{this.fail(s)}),this.unacked>=this.#o&&!this.#s&&(this.#s={acked:0,at:performance.now()},Bt("window full: %d bytes unacked, writes stalled",this.unacked)),this.#c(()=>this.unacked<this.#o)}#a(){if(this.#s&&this.unacked<=this.#o/2){const e=performance.now()-this.#s.at;Bt("pressure relieved after %dms: %d bytes acked, %s MB/s",Math.round(e),this.#s.acked,(this.#s.acked/Math.max(e,1)/1e3).toFixed(2)),this.#s=void 0}this.#n=this.#n.filter(e=>e.until()?(e.resolve(void 0),!1):!0)}#i(e){if(this.#t)return!1;this.#t={reason:e},this.#e.error(e);const r=this.#n;this.#n=[];for(const s of r)s.reject(e);return!0}#c(e){if(e())return Promise.resolve();const r={...Ne(),until:e};return this.#n.push(r),r.promise}}class ss extends WritableStream{get unacked(){return this.#e.unacked}#e;constructor(e){const r=new rs(e);super({abort:s=>{r.abort(s)},close:()=>r.close(),start:s=>{r.start(s)},write:s=>r.write(s)}),this.#e=r}fail(e){this.#e.fail(e)}}const ns=1024*1024;class is{#e;#t=!1;#r;#s;constructor(e){this.#r=e}cancel(e){this.#n(),this.#r?.(e)}close(){this.#n()&&this.#e.close()}error(e){this.#n()&&this.#e.error(e)}pull(){const e=this.#s;this.#s=void 0,e?.resolve(void 0)}async push(e){if(this.#t)return;this.#s??=Ne();const{promise:r}=this.#s;this.#e.enqueue(e),await r}start(e){this.#e=e}#n(){return this.#t?!1:(this.#t=!0,this.pull(),!0)}}class os extends ReadableStream{#e;constructor({highWaterMark:e=ns,onCancel:r}={}){const s=new is(r);super({cancel:n=>{s.cancel(n)},pull:()=>{s.pull()},start:n=>{s.start(n)}},new ByteLengthQueuingStrategy({highWaterMark:e})),this.#e=s}close(){this.#e.close()}error(e){this.#e.error(e)}push(e){return this.#e.push(e)}}class as{closed;readable;writable;#e=[];#t;#r;#s;#n;#o;#a="starting";constructor(e,{onClose:r,receiveBuffer:s,sendWindow:n,signal:i}){if(this.#o=e,this.#t=Ne(),this.closed=this.#t.promise,this.closed.catch(cs),this.#s=new os({highWaterMark:s,onCancel:()=>{this.#i(void 0)}}),this.readable=this.#s,this.#n=new ss({onAbort:()=>{this.#i(void 0)},onClose:()=>{this.#i(void 0)},onError:l=>{this.#i(l)},send:l=>e.request("appetizeio.device.server.debug.adbTunnel.data",{data:l}),window:n}),this.writable=this.#n,i){const l=()=>{this.#i(i.reason)};i.addEventListener("abort",l,{once:!0}),this.#e.push(()=>{i.removeEventListener("abort",l)})}this.#e.push(()=>{r(this)})}close=()=>{this.#i(void 0)};detach(){this.#i(void 0,{notifyServer:!1})}async handleData(e){this.#a==="open"&&await this.#s.push(e)}handleStopped({error:e}){this.#a==="open"&&this.#i(e?new Error(e):void 0)}async start(){try{await this.#o.request("appetizeio.device.server.debug.adbTunnel.start",void 0)}catch(e){throw this.#i(e),e}if(this.#a==="closed")throw this.#r?this.#r:new Error("The adb tunnel closed before it started");this.#a="open"}async[Symbol.asyncDispose](){this.close();try{await this.closed}catch{}}#i(e,{notifyServer:r=!0}={}){if(this.#a!=="closed"){this.#a="closed",this.#r=e,r&&ee(this.#o,"appetizeio.device.server.debug.adbTunnel.stop",void 0),e?(this.#s.error(e),this.#n.fail(e)):(this.#s.close(),this.#n.fail(new Error("The adb tunnel has stopped")));for(const s of this.#e)s();e?this.#t.reject(e):this.#t.resolve(void 0)}}}function cs(){}class ls{readable;ready;#e=[];#t=!1;#r;#s;#n;constructor({label:e,onClose:r,signal:s}){this.#s=e,this.ready=new Promise((i,l)=>{this.#n={reject:l,resolve:i}});let n;if(this.readable=new ReadableStream({cancel:()=>{this.#a()},start:i=>{n=i}}),!n)throw new Error("ReadableStream controller was not initialized");if(this.#r=n,s){const i=()=>{this.fail(s.reason)};s.addEventListener("abort",i,{once:!0}),this.#e.push(()=>{s.removeEventListener("abort",i)})}this.#e.push(()=>{r(this)})}close=()=>{this.#o()};fail(e){this.#o(e)}handleItem(e){this.#r.enqueue(e)}markReady(){if(!this.#n)return;const{resolve:e}=this.#n;this.#n=void 0,e(this)}async*[Symbol.asyncIterator](){const e=this.readable.getReader();try{for(let r=await e.read();!r.done;r=await e.read())yield r.value}finally{await e.cancel()}}#o(e){this.#t||(this.#r.close(),this.#a(e))}#a(e){this.#t=!0;for(const r of this.#e)r();this.#n?.reject(e??new Error(`${this.#s} closed before it started`)),this.#n=void 0}}class fs{get subscribers(){return this.#r}#e;#t;#r=new Set;constructor(e){this.#e=e}close(){this.#t=void 0;for(const e of[...this.#r])e.close();this.#r.clear()}add(e){this.#r.add(e)}ensureStarted(){return this.#t||(this.#t=(async()=>{try{return await this.#e.start()}catch(e){throw this.#t=void 0,e}})()),this.#t}release(e){this.#r.delete(e),!(this.#r.size>0||!this.#t)&&(this.#t=void 0,this.#e.stop())}}class zt extends fs{#e;constructor(e){super({start:e.start,stop:e.stop}),this.#e=e.label}async createStream({signal:e}={}){e?.throwIfAborted();const r=new ls({label:this.#e,onClose:s=>{this.release(s)},signal:e});this.add(r);try{await this.ensureStarted(),r.markReady()}catch(s){r.fail(s)}return await r.ready}handleNotification(e){for(const r of this.subscribers)r.handleItem(e)}}class us{#e;#t;#r;#s;constructor(e){this.#s=e,this.#t=new zt({label:"Log stream",start:()=>e.request("appetizeio.device.server.debug.log.start"),stop:()=>{ee(e,"appetizeio.device.server.debug.log.stop",void 0)}}),this.#r=new zt({label:"Proxy intercept stream",start:()=>e.request("appetizeio.device.server.debug.proxyIntercept.start"),stop:()=>{ee(e,"appetizeio.device.server.debug.proxyIntercept.stop",void 0)}})}close(){this.#e?.detach(),this.#t.close(),this.#r.close()}async createAdbTunnel({signal:e}={}){e?.throwIfAborted(),this.#e?.close();const r=new as(this.#s,{onClose:()=>{this.#e=void 0},signal:e});return this.#e=r,await r.start(),r}async createLogStream(e){return await this.#t.createStream(e)}async createProxyInterceptStream(e){return await this.#r.createStream(e)}async handleAdbTunnelData({data:e}){await this.#e?.handleData(e)}handleAdbTunnelStopped(e){this.#e?.handleStopped(e)}handleLogEntry(e){this.#t.handleNotification(e)}handleProxyInterceptEvent(e){this.#r.handleNotification(e)}}function Xe(t){return{...ds(t),index:t.index,within:t.within?Xe(t.within):void 0}}function ds(t){switch(t.by){case"testId":return{by:"testId",testId:t.testId};case"text":return{by:"text",text:hs(t.text)}}}function hs(t){return typeof t=="string"?{kind:"exact",value:t}:{flags:t.flags,kind:"regex",source:t.source}}const ps=400,Ft=["byTestId","byText","duration","index","x","y"],ys=new Set(Ft),ws=/^-?(?:\d+(?:\.\d*)?|\.\d+)$/u,gs=/^[a-z]$/u,et=/^\s$/u;class D extends SyntaxError{constructor(e,r,s){super(`${e} at position ${String(r)}`,{cause:s})}}class ms{#e=0;#t;constructor(e){this.#t=e}parse(){const e=[];for(;this.#e<this.#t.length;){const r=this.#i();if(et.test(r))this.#e++;else if(r===">"){if(this.#t.charAt(this.#e+1)===">")throw new D('Force press ">>" is not supported',this.#e);this.#e++,e.push({kind:"down"})}else if(r==="/")this.#e++,e.push({kind:"up"});else if(r==="{")e.push(this.#o());else{const[s]=this.#t.slice(this.#e,this.#e+2);throw new D(`Unexpected ${JSON.stringify(s)}; write selectors as {...}`,this.#e)}}return e}#r(){const e=this.#e,r=this.#c(s=>s!=="="&&!tt(s));if(this.#i()!=="=")return{kind:"bare",name:r,offset:e};if(r.length===0)throw new D('Expected an attribute name before "="',e);return this.#e++,{kind:"attribute",name:r,offset:e,value:this.#a()}}#s(){const e=this.#e;this.#e++;let r="";for(;;){const s=this.#i();if(this.#e++,s==='"')return r;if(s==="\\"){const n=this.#i();if(n!=='"'&&n!=="\\"&&n!=="")throw new D('Only \\" and \\\\ escapes are supported',this.#e-1);this.#e++,r+=n}else{if(s==="")throw new D("Unclosed string",e);r+=s}}}#n(){const e=this.#e;this.#e++;let r="",s=!1;for(;;){const i=this.#i();if(i==="")throw new D("Unclosed regex",e);if(this.#e++,i==="/"&&!s)break;r+=i,i==="\\"?(r+=this.#i(),this.#e++):i==="["?s=!0:i==="]"&&(s=!1)}const n=this.#c(i=>gs.test(i));try{return new RegExp(r,n)}catch(i){throw new D(`Invalid regex /${r}/${n}`,e,i)}}#o(){const e=this.#e;this.#e++;let r;const s={offsets:{}};for(let n=0;;n++){this.#l();const i=this.#i();if(i==="")throw new D('Unclosed "{"',e);if(i==="}"){if(this.#e++,n===0)throw new D('Expected a selector or wait in "{}"',e);return r===void 0?Ss(s,e):{duration:r,kind:"wait"}}const l=this.#r();if(n===0&&l.name==="wait")r=l.kind==="attribute"?$t(l.value,"wait"):ps;else{if(r!==void 0)throw new D('"wait" takes no other attributes',l.offset);bs(s,l,n)}}}#a(){const e=this.#e,r=this.#i();let s;if(r==='"')s={kind:"quoted",offset:e,text:this.#s()};else if(r==="/")s={kind:"regex",offset:e,regex:this.#n()};else{const n=this.#c(i=>!tt(i));if(n.length===0)throw new D('Expected a value after "="',e);return{kind:"raw",offset:e,text:n}}if(!tt(this.#i()))throw new D('Expected a space or "}" after the value',this.#e);return s}#i(){return this.#t.charAt(this.#e)}#c(e){const r=this.#e;for(;this.#e<this.#t.length&&e(this.#i());)this.#e++;return this.#t.slice(r,this.#e)}#l(){this.#c(e=>et.test(e))}}function jt(t){return new ms(t).parse()}function bs(t,e,r){const{name:s,offset:n}=e;if(e.kind==="attribute"){rt(t,s,n,e.value);return}if(!s.includes(","))throw new D(`Expected key=value, got ${JSON.stringify(s)}`,n);if(r>0)throw new D("Write the x,y position first",n);const[i,l,...y]=s.split(",");if(y.length>0)throw new D("Expected a screen position as x,y",n);const p=n+i.length+1;rt(t,"x",n,{kind:"raw",offset:n,text:i}),rt(t,"y",p,{kind:"raw",offset:p,text:l})}function Es(t){return ys.has(t)}function tt(t){return t===""||t==="}"||et.test(t)}function rt(t,e,r,s){if(!Es(e))throw new D(`Unknown attribute ${JSON.stringify(e)}; expected one of ${Ft.join(", ")}`,r);if(t.offsets[e]!==void 0)throw new D(`Duplicate attribute ${JSON.stringify(e)}`,r);switch(t.offsets[e]=r,e){case"byTestId":case"byText":if(t.byText!==void 0||t.byTestId!==void 0)throw new D("Only one of byText and byTestId may be given",r);e==="byText"?t.byText=xs(s):t.byTestId=As(s);return;default:t[e]=$t(s,e)}}function Ss(t,e){return{duration:t.duration,kind:"move",to:vs(t,e)}}function $t(t,e){if(t.kind!=="raw"||!ws.test(t.text))throw new D(`"${e}" takes a number`,t.offset);return Number(t.text)}function vs(t,e){const{byTestId:r,byText:s,index:n,offsets:i,x:l,y}=t;if(s!==void 0)return{by:"text",index:n,text:s,x:l,y};if(r!==void 0)return{by:"testId",index:n,testId:r,x:l,y};if(i.index!==void 0)throw new D('"index" needs byText or byTestId',i.index);if(l===void 0||y===void 0)throw new D("A screen position needs x and y",e);return{by:"position",x:l,y}}function As(t){if(t.kind==="regex")throw new D('"byTestId" takes a string',t.offset);return t.text}function xs(t){return t.kind==="regex"?t.regex:t.text}function Ae(t){return t.by==="position"?{by:"position",x:t.x,y:t.y}:{...Xe(t),x:t.x,y:t.y}}function ks(t){return t.map(e=>e.kind==="move"?{duration:e.duration,kind:"move",to:Ae(e.to)}:e)}function Is(t){return{press:e=>{ee(t,"appetizeio.device.server.keyboard.press",{key:e})}}}function Os({onRequest:t,parent:e,proxyInlet:r,signal:s}){const n=new Dt(e,{signal:s}),i=[()=>{n.close()}];return Nt(n,r),t&&i.push(_e(n,l=>{t(l,{source:"parent"})})),{cleanup:()=>{for(const l of i)l()},notifies:()=>e===globalThis.window?void 0:n}}function Ts({onRequest:t,proxyInlet:e}){const[r,s]=Ye(),i=[Yr(s),()=>{r.close()}];return Nt(r,e),t&&i.push(_e(r,l=>{t(l,{source:"parent"})})),{cleanup:()=>{for(const l of i)l()},notifies:()=>r}}function Rs(t){return"to"in t?{from:Ae(t.from),kind:"path",to:Ae(t.to)}:{direction:t.direction,distance:t.distance,from:t.from?Ae(t.from):void 0,kind:"direction"}}function Ms(t){return{down:(e,r)=>{ee(t,"appetizeio.device.server.touch.down",{x:e,y:r})},move:(e,r)=>{ee(t,"appetizeio.device.server.touch.move",{x:e,y:r})},up:(e,r)=>{ee(t,"appetizeio.device.server.touch.up",{x:e,y:r})}}}const Us=new Set(Ze),Ls=/^(?<key>[A-Za-z]+)>(?<repeat>\d+)\/$/u,Cs=/(\{\{|\{[^{}]*\})/u;function Ps(t){const e=[];let r="";function s(){r.length>0&&(e.push({kind:"text",text:r}),r="")}for(const[n,i]of t.split(Cs).entries())if(n%2===0){if(i.includes("{"))throw new Error(`Unclosed "{" in ${JSON.stringify(t)}`);r+=i}else i==="{{"?r+="{":(s(),e.push(Ns(i.slice(1,-1))));return s(),e}function _s(t,e){if(!Us.has(t))throw e.endsWith(">")?new Error(`Holding a key is not supported: {${e}}`):e.startsWith("/")?new Error(`Releasing a key is not supported: {${e}}`):new Error(`{${e}} does not name a supported key. Supported: ${Ze.join(", ")}. Type characters as text, and escape a literal "{" as "{{".`)}function Ns(t){const e=Ls.exec(t)?.groups,r=e?.key??t;if(_s(r,t),!e)return{key:r,kind:"press"};const s=Number(e.repeat);if(s<1)throw new Error(`Repeat for {${t}} must be at least 1`);return{key:r,kind:"press",repeat:s}}const Ds=Symbol("@appetizeio/client:v1Compat");function Vt(t){return t?.[Ds]}class Bs{readable;ready;get dimensions(){return this.#s}#e=[];#t=!1;#r;#s;#n;#o;constructor({onClose:e,requestKeyFrame:r,signal:s}){this.#n=r,this.ready=new Promise((i,l)=>{this.#o={reject:l,resolve:i}});let n;if(this.readable=new ReadableStream({cancel:()=>{this.#i()},start:i=>{n=i}}),!n)throw new Error("ReadableStream controller was not initialized");if(this.#r=n,s){const i=()=>{this.fail(s.reason)};s.addEventListener("abort",i,{once:!0}),this.#e.push(()=>{s.removeEventListener("abort",i)})}this.#e.push(()=>{e(this)})}close=()=>{this.#a()};fail(e){this.#a(e)}handleChunk(e){if(this.#o){if(e.type!=="key")return;const{resolve:r}=this.#o;this.#o=void 0,this.#s={height:e.height,width:e.width},r(this)}else e.type==="key"&&(this.#s={height:e.height,width:e.width});this.#r.enqueue(e)}requestKeyFrame=()=>{this.#t||this.#n()};async*[Symbol.asyncIterator](){const e=this.readable.getReader();try{for(let r=await e.read();!r.done;r=await e.read())yield r.value}finally{await e.cancel()}}#a(e){this.#t||(this.#r.close(),this.#i(e))}#i(e){this.#t=!0;for(const r of this.#e)r();this.#o?.reject(e??new Error("Video stream closed before the first key chunk")),this.#o=void 0}}class zs{#e=!1;#t;#r;#s=new Set;constructor(e){this.#t=e}close(){this.#r=void 0;for(const e of[...this.#s])e.close()}async createStream({signal:e}={}){e?.throwIfAborted();const r=new Bs({onClose:s=>{this.#o(s)},requestKeyFrame:()=>{this.#a()},signal:e});this.#s.add(r);try{await this.#n()}catch(s){r.fail(s)}return await r.ready}handleChunk(e){e.type==="key"&&(this.#e=!1);for(const r of this.#s)r.handleChunk(e)}#n(){return this.#r?(this.#a(),this.#r):(this.#e=!0,this.#r=(async()=>{try{await this.#t.request("appetizeio.device.server.video.start")}catch(e){throw this.#r=void 0,e}})(),this.#r)}#o(e){this.#s.delete(e),!(this.#s.size>0||!this.#r)&&(this.#r=void 0,ee(this.#t,"appetizeio.device.server.video.stop",void 0))}#a(){this.#e||(this.#e=!0,ee(this.#t,"appetizeio.device.server.video.requestKeyFrame",void 0))}}class Fs{debug;keyboard;touch;video;#e;#t=[];#r;constructor(e,r={}){const s=Vt(r)??{},{baseUrl:n,onClose:i,signal:l}=r;this.#e=n?js(n):void 0;const{onRequest:y,parent:p,proxyRequest:A}=s,E=$s(y);l?.addEventListener("abort",this.close);const[R,M]=Ye(),[N,_]=Ye();this.#t.push(()=>{R.close(),M.close(),N.close(),_.close()}),this.#t.push(He(_,e,{leftEffects:A}));const C=p==="playwright"?Ts({onRequest:E,proxyInlet:N}):p?Os({onRequest:E,parent:p,proxyInlet:N,signal:l}):void 0;C&&this.#t.push(C.cleanup),this.#t.push(He(M,N,{notifiesLeft:C?.notifies}));const{client:Z,unsub:Ee}=Xr(R,{"appetizeio.device.client.debug.adbTunnel.data":V=>Y.handleAdbTunnelData(V),"appetizeio.device.client.debug.adbTunnel.stopped":async V=>{Y.handleAdbTunnelStopped(V)},"appetizeio.device.client.debug.log.entry":async V=>{Y.handleLogEntry(V)},"appetizeio.device.client.debug.proxyIntercept.event":async V=>{Y.handleProxyInterceptEvent(V)},"appetizeio.device.client.video.chunk":async V=>{k.handleChunk(V)}});this.#r=Z,this.#t.push(Ee);const Y=new us(this.#r);this.#t.push(()=>{Y.close()});const k=new zs(this.#r);this.#t.push(()=>{k.close()}),this.debug=Y,this.keyboard=Is(this.#r),this.touch=Ms(this.#r),this.video=k,E&&(this.#t.push(_e(M,V=>{E(V,{source:"self"})})),e instanceof Dt&&this.#t.push(_e(e,V=>{E(V,{source:"iframe"})}))),this.#t.push(()=>i?.())}async clearKeychain(){await this.#r.request("appetizeio.device.server.clearKeychain")}close=()=>{for(const e of this.#t)try{e()}catch(r){console.error("Device cleanup error:",r)}};async fold(e){await this.#r.request("appetizeio.device.server.fold",{hinge:e})}async gesture(e,r){await this.#r.request("appetizeio.device.server.gesture",{options:r,steps:ks(typeof e=="string"?jt(e):e)})}async inspect(e,r){return await this.#r.request("appetizeio.device.server.inspect",{options:r,selector:e?Xe(e):void 0})}async open(e){new URL(e),await this.#r.request("appetizeio.device.server.open",{url:e})}async press(e){await this.#r.request("appetizeio.device.server.press",{action:e})}async rotate(e){await this.#r.request("appetizeio.device.server.rotate",{orientation:e})}async screenshot(){const e=await this.#r.request("appetizeio.device.server.screenshot"),r=this.#e?new URL(e.url,this.#e).href:e.url,s=await fetch(r);if(!s.ok)throw new Error(`Screenshot download failed: ${String(s.status)} ${s.statusText}`);const n=s.headers.get("content-type")??"application/octet-stream";return{data:new Uint8Array(await s.arrayBuffer()),mimeType:n}}async swipe(e,r){await this.#r.request("appetizeio.device.server.swipe",{gesture:Rs(e),options:r})}async tap(e,r){await this.#r.request("appetizeio.device.server.tap",{options:r,selector:Ae(e)})}async type(e,r){await this.#r.request("appetizeio.device.server.type",{options:r,steps:Ps(e)})}}function js(t){const e=new URL(t);return e.protocol==="ws:"?e.protocol="http:":e.protocol==="wss:"&&(e.protocol="https:"),e.href}const $s=t=>{if(t)return(e,r)=>{e.method.startsWith("appetizeio.device.server.")&&t(e,r)}};let st;try{st=new TextDecoder}catch{}let w,q,f=0;const nt=[],Vs=105,Ks=57342,qs=57343,Kt=57337,qt=6,pe={};let xe=11281e4,te=1681e4,ae=nt,ke=0,I={},B,Ie,Oe=0,ce=0,z,G,F=[],it=[],W,K,Te,Wt={useRecords:!1,mapsAsObjects:!0},Re=!1,Jt=2;try{new Function("")}catch{Jt=1/0}class be{constructor(e){if(e&&((e.keyMap||e._keyMap)&&!e.useRecords&&(e.useRecords=!1,e.mapsAsObjects=!0),e.useRecords===!1&&e.mapsAsObjects===void 0&&(e.mapsAsObjects=!0),e.getStructures&&(e.getShared=e.getStructures),e.getShared&&!e.structures&&((e.structures=[]).uninitialized=!0),e.keyMap)){this.mapKey=new Map;for(let[r,s]of Object.entries(e.keyMap))this.mapKey.set(s,r)}Object.assign(this,e)}decodeKey(e){return this.keyMap&&this.mapKey.get(e)||e}encodeKey(e){return this.keyMap&&this.keyMap.hasOwnProperty(e)?this.keyMap[e]:e}encodeKeys(e){if(!this._keyMap)return e;let r=new Map;for(let[s,n]of Object.entries(e))r.set(this._keyMap.hasOwnProperty(s)?this._keyMap[s]:s,n);return r}decodeKeys(e){if(!this._keyMap||e.constructor.name!="Map")return e;if(!this._mapKey){this._mapKey=new Map;for(let[s,n]of Object.entries(this._keyMap))this._mapKey.set(n,s)}let r={};return e.forEach((s,n)=>r[H(this._mapKey.has(n)?this._mapKey.get(n):n)]=s),r}mapDecode(e,r){let s=this.decode(e);return this._keyMap&&s.constructor.name==="Array"?s.map(n=>this.decodeKeys(n)):s}decode(e,r){if(w)return er(()=>(lt(),this?this.decode(e,r):be.prototype.decode.call(Wt,e,r)));q=r>-1?r:e.length,f=0,ke=0,ce=0,Ie=null,ae=nt,z=null,w=e;try{K=e.dataView||(e.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength))}catch(s){throw w=null,e instanceof Uint8Array?s:new Error("Source must be a Uint8Array or Buffer but was a "+(e&&typeof e=="object"?e.constructor.name:typeof e))}if(this instanceof be){if(I=this,W=this.sharedValues&&(this.pack?new Array(this.maxPrivatePackedValues||16).concat(this.sharedValues):this.sharedValues),this.structures)return B=this.structures,De();(!B||B.length>0)&&(B=[])}else I=Wt,(!B||B.length>0)&&(B=[]),W=null;return De()}decodeMultiple(e,r){let s,n=0;try{let i=e.length;Re=!0;let l=this?this.decode(e,i):ut.decode(e,i);if(r){if(r(l)===!1)return;for(;f<i;)if(n=f,r(De())===!1)return}else{for(s=[l];f<i;)n=f,s.push(De());return s}}catch(i){throw i.lastPosition=n,i.values=s,i}finally{Re=!1,lt()}}}function De(){try{let t=O();if(z){if(f>=z.postBundlePosition){let e=new Error("Unexpected bundle position");throw e.incomplete=!0,e}f=z.postBundlePosition,z=null}if(f==q)B=null,w=null,G&&(G=null);else if(f>q){let e=new Error("Unexpected end of CBOR data");throw e.incomplete=!0,e}else if(!Re)throw new Error("Data read, but end of buffer not reached");return t}catch(t){throw lt(),(t instanceof RangeError||t.message.startsWith("Unexpected end of buffer"))&&(t.incomplete=!0),t}}function le(){let t=new Error("Unexpected end of CBOR data");return t.incomplete=!0,t}function O(){if(!(f<q))throw le();let t=w[f++],e=t>>5;if(t=t&31,t>23)switch(t){case 24:if(f>=q)throw le();t=w[f++];break;case 25:if(e==7)return Hs();t=K.getUint16(f),f+=2;break;case 26:if(e==7){let r=K.getFloat32(f);if(I.useFloat32>2){let s=ft[(w[f]&127)<<1|w[f+1]>>7];return f+=4,(s*r+(r>0?.5:-.5)>>0)/s}return f+=4,r}if(t=K.getUint32(f),f+=4,e===1)return-1-t;break;case 27:if(e==7){let r=K.getFloat64(f);return f+=8,r}if(e>1){if(K.getUint32(f)>0)throw new Error("JavaScript does not support arrays, maps, or strings with length over 4294967295");t=K.getUint32(f+4)}else I.int64AsNumber?(t=K.getUint32(f)*4294967296,t+=K.getUint32(f+4)):t=K.getBigUint64(f);f+=8;break;case 31:switch(e){case 2:case 3:throw new Error("Indefinite length not supported for byte or text strings");case 4:let r=[],s,n=0;for(;(s=O())!=pe;){if(n>=xe)throw new Error(`Array length exceeds ${xe}`);r[n++]=s}return e==4?r:e==3?r.join(""):Buffer.concat(r);case 5:let i;if(I.mapsAsObjects){let l={},y=0;if(I.keyMap)for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Property count exceeds ${te}`);l[H(I.decodeKey(i))]=O()}else for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Property count exceeds ${te}`);l[H(i)]=O()}return l}else{Te&&(I.mapsAsObjects=!0,Te=!1);let l=new Map;if(I.keyMap){let y=0;for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Map size exceeds ${te}`);l.set(I.decodeKey(i),O())}}else{let y=0;for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Map size exceeds ${te}`);l.set(i,O())}}return l}case 7:return pe;default:throw new Error("Invalid major type for indefinite length "+e)}default:throw new Error("Unknown token "+t)}switch(e){case 0:return t;case 1:return~t;case 2:return Gs(t);case 3:if(ce>=f)return Ie.slice(f-Oe,(f+=t)-Oe);if(ce==0&&q<140&&t<32){let n=t<16?Zt(t):Js(t);if(n!=null)return n}return Ht(t);case 4:if(t>=xe)throw new Error(`Array length exceeds ${xe}`);if(t>q-f)throw le();let r=new Array(t);for(let n=0;n<t;n++)r[n]=O();return r;case 5:if(t>=te)throw new Error(`Map size exceeds ${xe}`);if(t>(q-f)/2)throw le();if(I.mapsAsObjects){let n={};if(I.keyMap)for(let i=0;i<t;i++)n[H(I.decodeKey(O()))]=O();else for(let i=0;i<t;i++)n[H(O())]=O();return n}else{Te&&(I.mapsAsObjects=!0,Te=!1);let n=new Map;if(I.keyMap)for(let i=0;i<t;i++)n.set(I.decodeKey(O()),O());else for(let i=0;i<t;i++)n.set(O(),O());return n}case 6:if(t>=Kt){let n=B[t&8191];if(n)return n.read||(n.read=ot(n)),n.read();if(t<65536){if(t==qs){let i=we(),l=O(),y=O();at(l,y);let p={};if(I.keyMap)for(let A=2;A<i;A++){let E=I.decodeKey(y[A-2]);p[H(E)]=O()}else for(let A=2;A<i;A++){let E=y[A-2];p[H(E)]=O()}return p}else if(t==Ks){let i=we(),l=O();for(let y=2;y<i;y++)at(l++,O());return O()}else if(t==Kt)return tn();if(I.getShared&&(ct(),n=B[t&8191],n))return n.read||(n.read=ot(n)),n.read()}}let s=F[t];if(s)return s.handlesRead?s(O):s(O());{let n=O();for(let i=0;i<it.length;i++){let l=it[i](t,n);if(l!==void 0)return l}return new fe(n,t)}case 7:switch(t){case 20:return!1;case 21:return!0;case 22:return null;case 23:return;default:let n=(W||ue())[t];if(n!==void 0)return n;throw new Error("Unknown token "+t)}default:throw isNaN(t)?le():new Error("Unknown CBOR token "+t)}}const Gt=/^[a-zA-Z_$][a-zA-Z\d_$]*$/;function ot(t){if(!t)throw new Error("Structure is required in record definition");function e(){let r=w[f++];if(r=r&31,r>23)switch(r){case 24:r=w[f++];break;case 25:r=K.getUint16(f),f+=2;break;case 26:r=K.getUint32(f),f+=4;break;default:throw new Error("Expected array header, but got "+w[f-1])}let s=this.compiledReader;for(;s;){if(s.propertyCount===r)return s(O);s=s.next}if(this.slowReads++>=Jt){let i=this.length==r?this:this.slice(0,r);return s=I.keyMap?new Function("r","return {"+i.map(l=>I.decodeKey(l)).map(l=>Gt.test(l)?H(l)+":r()":"["+JSON.stringify(l)+"]:r()").join(",")+"}"):new Function("r","return {"+i.map(l=>Gt.test(l)?H(l)+":r()":"["+JSON.stringify(l)+"]:r()").join(",")+"}"),this.compiledReader&&(s.next=this.compiledReader),s.propertyCount=r,this.compiledReader=s,s(O)}let n={};if(I.keyMap)for(let i=0;i<r;i++)n[H(I.decodeKey(this[i]))]=O();else for(let i=0;i<r;i++)n[H(this[i])]=O();return n}return t.slowReads=0,e}function H(t){if(typeof t=="string")return t==="__proto__"?"__proto_":t;if(typeof t=="number"||typeof t=="boolean"||typeof t=="bigint")return t.toString();if(t==null)return t+"";throw new Error("Invalid property name type "+typeof t)}let Ht=Be;function Ws(t){Ht=e();function e(r){return function(n){let i=ae[ke++];if(i==null){if(z)return Be(n);let y=t(f,q,n,w);if(typeof y=="string")i=y,ae=nt;else if(ae=y,ke=1,ce=1,i=ae[0],i===void 0)throw new Error("Unexpected end of buffer")}let l=i.length;return l<=n?(f+=n,i):(Ie=i,Oe=f,ce=f+l,f+=n,i.slice(0,n))}}}function Be(t){let e;if(t<16&&(e=Zt(t)))return e;if(t>64&&st)return st.decode(w.subarray(f,f+=t));const r=f+t,s=[];for(e="";f<r;){const n=w[f++];if((n&128)===0)s.push(n);else if((n&224)===192)if(n<194||f>=r||(w[f]&192)!==128)s.push(65533);else{const i=w[f++]&63;s.push((n&31)<<6|i)}else if((n&240)===224){const i=f<r?w[f]:0;if(f>=r||(i&192)!==128||n===224&&i<160||n===237&&i>=160)s.push(65533);else if(f++,f>=r||(w[f]&192)!==128)s.push(65533);else{const l=w[f++]&63;s.push((n&31)<<12|(i&63)<<6|l)}}else if((n&248)===240){const i=f<r?w[f]:0;if(n>244||f>=r||(i&192)!==128||n===240&&i<144||n===244&&i>=144)s.push(65533);else if(f++,f>=r||(w[f]&192)!==128)s.push(65533);else{const l=w[f++]&63;if(f>=r||(w[f]&192)!==128)s.push(65533);else{const y=w[f++]&63;let p=(n&7)<<18|(i&63)<<12|l<<6|y;p-=65536,s.push(p>>>10&1023|55296),s.push(56320|p&1023)}}}else s.push(65533);s.length>=4096&&(e+=$.apply(String,s),s.length=0)}return s.length>0&&(e+=$.apply(String,s)),e}let $=String.fromCharCode;function Js(t){let e=f,r=new Array(t);for(let s=0;s<t;s++){const n=w[f++];if((n&128)>0){f=e;return}r[s]=n}return $.apply(String,r)}function Zt(t){if(t<4)if(t<2){if(t===0)return"";{let e=w[f++];if((e&128)>1){f-=1;return}return $(e)}}else{let e=w[f++],r=w[f++];if((e&128)>0||(r&128)>0){f-=2;return}if(t<3)return $(e,r);let s=w[f++];if((s&128)>0){f-=3;return}return $(e,r,s)}else{let e=w[f++],r=w[f++],s=w[f++],n=w[f++];if((e&128)>0||(r&128)>0||(s&128)>0||(n&128)>0){f-=4;return}if(t<6){if(t===4)return $(e,r,s,n);{let i=w[f++];if((i&128)>0){f-=5;return}return $(e,r,s,n,i)}}else if(t<8){let i=w[f++],l=w[f++];if((i&128)>0||(l&128)>0){f-=6;return}if(t<7)return $(e,r,s,n,i,l);let y=w[f++];if((y&128)>0){f-=7;return}return $(e,r,s,n,i,l,y)}else{let i=w[f++],l=w[f++],y=w[f++],p=w[f++];if((i&128)>0||(l&128)>0||(y&128)>0||(p&128)>0){f-=8;return}if(t<10){if(t===8)return $(e,r,s,n,i,l,y,p);{let A=w[f++];if((A&128)>0){f-=9;return}return $(e,r,s,n,i,l,y,p,A)}}else if(t<12){let A=w[f++],E=w[f++];if((A&128)>0||(E&128)>0){f-=10;return}if(t<11)return $(e,r,s,n,i,l,y,p,A,E);let R=w[f++];if((R&128)>0){f-=11;return}return $(e,r,s,n,i,l,y,p,A,E,R)}else{let A=w[f++],E=w[f++],R=w[f++],M=w[f++];if((A&128)>0||(E&128)>0||(R&128)>0||(M&128)>0){f-=12;return}if(t<14){if(t===12)return $(e,r,s,n,i,l,y,p,A,E,R,M);{let N=w[f++];if((N&128)>0){f-=13;return}return $(e,r,s,n,i,l,y,p,A,E,R,M,N)}}else{let N=w[f++],_=w[f++];if((N&128)>0||(_&128)>0){f-=14;return}if(t<15)return $(e,r,s,n,i,l,y,p,A,E,R,M,N,_);let C=w[f++];if((C&128)>0){f-=15;return}return $(e,r,s,n,i,l,y,p,A,E,R,M,N,_,C)}}}}}function Gs(t){return I.copyBuffers?Uint8Array.prototype.slice.call(w,f,f+=t):w.subarray(f,f+=t)}let Yt=new Float32Array(1),ze=new Uint8Array(Yt.buffer,0,4);function Hs(){let t=w[f++],e=w[f++],r=(t&127)>>2;if(r===31)return e||t&3?NaN:t&128?-1/0:1/0;if(r===0){let s=((t&3)<<8|e)/16777216;return t&128?-s:s}return ze[3]=t&128|(r>>1)+56,ze[2]=(t&7)<<5|e>>3,ze[1]=e<<5,ze[0]=0,Yt[0]}new Array(4096);class fe{constructor(e,r){this.value=e,this.tag=r}}F[0]=t=>new Date(t),F[1]=t=>new Date(Math.round(t*1e3)),F[2]=t=>{let e=BigInt(0);for(let r=0,s=t.byteLength;r<s;r++)e=BigInt(t[r])+(e<<BigInt(8));return e},F[3]=t=>BigInt(-1)-F[2](t),F[4]=t=>+(t[1]+"e"+t[0]),F[5]=t=>t[1]*Math.exp(t[0]*Math.log(2));const at=(t,e)=>{t=t-57344;let r=B[t];r&&r.isShared&&((B.restoreStructures||(B.restoreStructures=[]))[t]=r),B[t]=e,e.read=ot(e)};F[Vs]=t=>{let e=t.length,r=t[1];at(t[0],r);let s={};for(let n=2;n<e;n++){let i=r[n-2];s[H(i)]=t[n]}return s},F[14]=t=>z?z[0].slice(z.position0,z.position0+=t):new fe(t,14),F[15]=t=>z?z[1].slice(z.position1,z.position1+=t):new fe(t,15);let Zs={Error,RegExp};F[27]=t=>(Zs[t[0]]||Error)(t[1],t[2]);const Qt=t=>{if(w[f++]!=132){let r=new Error("Packed values structure must be followed by a 4 element array");throw w.length<f&&(r.incomplete=!0),r}let e=t();if(!e||!e.length){let r=new Error("Packed values structure must be followed by a 4 element array");throw r.incomplete=!0,r}return W=W?e.concat(W.slice(e.length)):e,W.prefixes=t(),W.suffixes=t(),t()};Qt.handlesRead=!0,F[51]=Qt,F[qt]=t=>{if(!W)if(I.getShared)ct();else return new fe(t,qt);if(typeof t=="number")return W[16+(t>=0?2*t:-2*t-1)];let e=new Error("No support for non-integer packed references yet");throw t===void 0&&(e.incomplete=!0),e},F[28]=t=>{G||(G=new Map,G.id=0);let e=G.id++,r=f,s=w[f],n;s>>5==4?n=[]:n={};let i={target:n};G.set(e,i);let l=t();return i.used?(Object.getPrototypeOf(n)!==Object.getPrototypeOf(l)&&(f=r,n=l,G.set(e,{target:n}),l=t()),Object.assign(n,l)):(i.target=l,l)},F[28].handlesRead=!0,F[29]=t=>{let e=G.get(t);return e.used=!0,e.target},F[258]=t=>new Set(t),(F[259]=t=>(I.mapsAsObjects&&(I.mapsAsObjects=!1,Te=!0),t())).handlesRead=!0;function ye(t,e){return typeof t=="string"?t+e:t instanceof Array?t.concat(e):Object.assign({},t,e)}function ue(){if(!W)if(I.getShared)ct();else throw new Error("No packed values available");return W}const Ys=1399353956;it.push((t,e)=>{if(t>=225&&t<=255)return ye(ue().prefixes[t-224],e);if(t>=28704&&t<=32767)return ye(ue().prefixes[t-28672],e);if(t>=1879052288&&t<=2147483647)return ye(ue().prefixes[t-1879048192],e);if(t>=216&&t<=223)return ye(e,ue().suffixes[t-216]);if(t>=27647&&t<=28671)return ye(e,ue().suffixes[t-27639]);if(t>=1811940352&&t<=1879048191)return ye(e,ue().suffixes[t-1811939328]);if(t==Ys)return{packedValues:W,structures:B.slice(0),version:e};if(t==55799)return e});const Qs=new Uint8Array(new Uint16Array([1]).buffer)[0]==1,Xt=[Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array,typeof BigUint64Array>"u"?{name:"BigUint64Array"}:BigUint64Array,Int8Array,Int16Array,Int32Array,typeof BigInt64Array>"u"?{name:"BigInt64Array"}:BigInt64Array,Float32Array,Float64Array],Xs=[64,68,69,70,71,72,77,78,79,85,86];for(let t=0;t<Xt.length;t++)en(Xt[t],Xs[t]);function en(t,e){let r="get"+t.name.slice(0,-5),s;typeof t=="function"?s=t.BYTES_PER_ELEMENT:t=null;for(let n=0;n<2;n++){if(!n&&s==1)continue;let i=s==2?1:s==4?2:s==8?3:0;F[n?e:e-4]=s==1||n==Qs?l=>{if(!t)throw new Error("Could not find typed array for code "+e);return!I.copyBuffers&&(s===1||s===2&&!(l.byteOffset&1)||s===4&&!(l.byteOffset&3)||s===8&&!(l.byteOffset&7))?new t(l.buffer,l.byteOffset,l.byteLength>>i):new t(Uint8Array.prototype.slice.call(l,0).buffer)}:l=>{if(!t)throw new Error("Could not find typed array for code "+e);let y=new DataView(l.buffer,l.byteOffset,l.byteLength),p=l.length>>i,A=new t(p),E=y[r];for(let R=0;R<p;R++)A[R]=E.call(y,R<<i,n);return A}}}function tn(){let t=we(),e=f+O();for(let s=2;s<t;s++){let n=we();f+=n}let r=f;return f=e,z=[Be(we()),Be(we())],z.position0=0,z.position1=0,z.postBundlePosition=f,f=r,O()}function we(){if(!(f<q))throw le();let t=w[f++]&31;if(t>23)switch(t){case 24:if(f>=q)throw le();t=w[f++];break;case 25:t=K.getUint16(f),f+=2;break;case 26:t=K.getUint32(f),f+=4;break}return t}function ct(){if(I.getShared){let t=er(()=>(w=null,I.getShared()))||{},e=t.structures||[];I.sharedVersion=t.version,W=I.sharedValues=t.packedValues,B===!0?I.structures=B=e:B.splice.apply(B,[0,e.length].concat(e))}}function er(t){let e=q,r=f,s=ke,n=Oe,i=ce,l=Ie,y=ae,p=G,A=z,E=new Uint8Array(w.slice(0,q)),R=B,M=I,N=Re,_=t();return q=e,f=r,ke=s,Oe=n,ce=i,Ie=l,ae=y,G=p,z=A,w=E,Re=N,B=R,I=M,K=new DataView(w.buffer,w.byteOffset,w.byteLength),_}function lt(){w=null,G=null,B=null}const ft=new Array(147);for(let t=0;t<256;t++)ft[t]=+("1e"+Math.floor(45.15-t*.30103));let ut=new be({useRecords:!1});const rn=ut.decode;ut.decodeMultiple;let Fe;try{Fe=new TextEncoder}catch{}let dt,tr;const je=typeof globalThis=="object"&&globalThis.Buffer,Me=typeof je<"u",ht=Me?je.allocUnsafeSlow:Uint8Array,rr=Me?je:Uint8Array,sr=256,nr=Me?4294967296:2144337920;let pt,c,L,o=0,re,j=null;const sn=61440,nn=/[\u0080-\uFFFF]/,J=Symbol("record-id");class ir extends be{constructor(e){super(e),this.offset=0;let r,s,n,i,l;e=e||{};let y=rr.prototype.utf8Write?function(a,g){return c.utf8Write(a,g,c.byteLength-g)}:Fe&&Fe.encodeInto?function(a,g){return Fe.encodeInto(a,c.subarray(g)).written}:!1,p=this,A=e.structures||e.saveStructures,E=e.maxSharedStructures;if(E==null&&(E=A?128:0),E>8190)throw new Error("Maximum maxSharedStructure is 8190");let R=e.sequential;R&&(E=0),this.structures||(this.structures=[]),this.saveStructures&&(this.saveShared=this.saveStructures);let M,N,_=e.sharedValues,C;if(_){C=Object.create(null);for(let a=0,g=_.length;a<g;a++)C[_[a]]=a}let Z=[],Ee=0,Y=0;this.mapEncode=function(a,g){return this._keyMap&&!this._mapped&&a.constructor.name==="Array"&&(a=a.map(d=>this.encodeKeys(d))),this.encode(a,g)},this.encode=function(a,g){if(c||(c=new ht(8192),L=new DataView(c.buffer,0,8192),o=0),re=c.length-10,re-o<2048?(c=new ht(c.length),L=new DataView(c.buffer,0,c.length),re=c.length-10,o=0):g===lr&&(o=o+7&2147483640),r=o,p.useSelfDescribedHeader&&(L.setUint32(o,3654940416),o+=3),l=p.structuredClone?new Map:null,p.bundleStrings&&typeof a!="string"?(j=[],j.size=1/0):j=null,s=p.structures,s){if(s.uninitialized){let h=p.getShared()||{};p.structures=s=h.structures||[],p.sharedVersion=h.version;let u=p.sharedValues=h.packedValues;if(u){C={};for(let b=0,S=u.length;b<S;b++)C[u[b]]=b}}let d=s.length;if(d>E&&!R&&(d=E),!s.transitions){s.transitions=Object.create(null);for(let h=0;h<d;h++){let u=s[h];if(!u)continue;let b,S=s.transitions;for(let v=0,x=u.length;v<x;v++){S[J]===void 0&&(S[J]=h);let T=u[v];b=S[T],b||(b=S[T]=Object.create(null)),S=b}S[J]=h|1048576}}R||(s.nextId=d)}if(n&&(n=!1),i=s||[],N=C,e.pack){let d=new Map;if(d.values=[],d.encoder=p,d.maxValues=e.maxPrivatePackedValues||(C?16:1/0),d.objectMap=C||!1,d.samplingPackedValues=M,$e(a,d),d.values.length>0){c[o++]=216,c[o++]=51,Q(4);let h=d.values;k(h),Q(0),Q(0),N=Object.create(C||null);for(let u=0,b=h.length;u<b;u++)N[h[u]]=u}}pt=g&mt;try{if(pt)return;if(k(a),j&&cr(r,k),p.offset=o,l&&l.idsToInsert){o+=l.idsToInsert.length*2,o>re&&de(o),p.offset=o;let d=cn(c.subarray(r,o),l.idsToInsert);return l=null,d}return g&lr?(c.start=r,c.end=o,c):c.subarray(r,o)}finally{if(s){if(Y<10&&Y++,s.length>E&&(s.length=E),Ee>1e4)s.transitions=null,Y=0,Ee=0,Z.length>0&&(Z=[]);else if(Z.length>0&&!R){for(let d=0,h=Z.length;d<h;d++)Z[d][J]=void 0;Z=[]}}if(n&&p.saveShared){p.structures.length>E&&(p.structures=p.structures.slice(0,E));let d=c.subarray(r,o);return p.updateSharedData()===!1?p.encode(a):d}g&fn&&(o=r)}},this.findCommonStringsToPack=()=>(M=new Map,C||(C=Object.create(null)),a=>{let g=a&&a.threshold||4,d=this.pack?a.maxPrivatePackedValues||16:0;_||(_=this.sharedValues=[]);for(let[h,u]of M)u.count>g&&(C[h]=d++,_.push(h),n=!0);for(;this.saveShared&&this.updateSharedData()===!1;);M=null});const k=a=>{o>re&&(c=de(o));var g=typeof a,d;if(g==="string"){if(N){let S=N[a];if(S>=0){S<16?c[o++]=S+224:(c[o++]=198,S&1?k(15-S>>1):k(S-16>>1));return}else if(M&&!e.pack){let v=M.get(a);v?v.count++:M.set(a,{count:1})}}let h=a.length;if(j&&h>=4&&h<1024){if((j.size+=h)>sn){let v,x=(j[0]?j[0].length*3+j[1].length:0)+10;o+x>re&&(c=de(o+x)),c[o++]=217,c[o++]=223,c[o++]=249,c[o++]=j.position?132:130,c[o++]=26,v=o-r,o+=4,j.position&&cr(r,k),j=["",""],j.size=0,j.position=v}let S=nn.test(a);j[S?0:1]+=a,c[o++]=S?206:207,k(h);return}let u;h<32?u=1:h<256?u=2:h<65536?u=3:u=5;let b=h*3;if(o+b>re&&(c=de(o+b)),h<64||!y){let S,v,x,T=o+u;for(S=0;S<h;S++)v=a.charCodeAt(S),v<128?c[T++]=v:v<2048?(c[T++]=v>>6|192,c[T++]=v&63|128):(v&64512)===55296&&((x=a.charCodeAt(S+1))&64512)===56320?(v=65536+((v&1023)<<10)+(x&1023),S++,c[T++]=v>>18|240,c[T++]=v>>12&63|128,c[T++]=v>>6&63|128,c[T++]=v&63|128):(c[T++]=v>>12|224,c[T++]=v>>6&63|128,c[T++]=v&63|128);d=T-o-u}else d=y(a,o+u,b);d<24?c[o++]=96|d:d<256?(u<2&&c.copyWithin(o+2,o+1,o+1+d),c[o++]=120,c[o++]=d):d<65536?(u<3&&c.copyWithin(o+3,o+2,o+2+d),c[o++]=121,c[o++]=d>>8,c[o++]=d&255):(u<5&&c.copyWithin(o+5,o+3,o+3+d),c[o++]=122,L.setUint32(o,d),o+=4),o+=d}else if(g==="number")if(!this.alwaysUseFloat&&a>>>0===a)a<24?c[o++]=a:a<256?(c[o++]=24,c[o++]=a):a<65536?(c[o++]=25,c[o++]=a>>8,c[o++]=a&255):(c[o++]=26,L.setUint32(o,a),o+=4);else if(!this.alwaysUseFloat&&a>>0===a)a>=-24?c[o++]=31-a:a>=-256?(c[o++]=56,c[o++]=~a):a>=-65536?(c[o++]=57,L.setUint16(o,~a),o+=2):(c[o++]=58,L.setUint32(o,~a),o+=4);else if(!this.alwaysUseFloat&&a<0&&a>=-4294967296&&Math.floor(a)===a)c[o++]=58,L.setUint32(o,-1-a),o+=4;else{let h;if((h=this.useFloat32)>0&&a<4294967296&&a>=-2147483648){c[o++]=250,L.setFloat32(o,a);let u;if(h<4||(u=a*ft[(c[o]&127)<<1|c[o+1]>>7])>>0===u){o+=4;return}else o--}c[o++]=251,L.setFloat64(o,a),o+=8}else if(g==="object")if(!a)c[o++]=246;else{if(l){let u=l.get(a);if(u){if(c[o++]=216,c[o++]=29,c[o++]=25,!u.references){let b=l.idsToInsert||(l.idsToInsert=[]);u.references=[],b.push(u)}u.references.push(o-r),o+=2;return}else l.set(a,{offset:o-r})}let h=a.constructor;if(h===Object)this.skipFunction===!0&&(a=Object.fromEntries([...Object.keys(a).filter(u=>typeof a[u]!="function").map(u=>[u,a[u]])])),V(a);else if(h===Array){d=a.length,d<24?c[o++]=128|d:Q(d);for(let u=0;u<d;u++)k(a[u])}else if(h===Map)if((this.mapsAsObjects?this.useTag259ForMaps!==!1:this.useTag259ForMaps)&&(c[o++]=217,c[o++]=1,c[o++]=3),d=a.size,d<24?c[o++]=160|d:d<256?(c[o++]=184,c[o++]=d):d<65536?(c[o++]=185,c[o++]=d>>8,c[o++]=d&255):(c[o++]=186,L.setUint32(o,d),o+=4),p.keyMap)for(let[u,b]of a)k(p.encodeKey(u)),k(b);else for(let[u,b]of a)k(u),k(b);else{for(let u=0,b=dt.length;u<b;u++){let S=tr[u];if(a instanceof S){let v=dt[u],x=v.tag;x==null&&(x=v.getTag&&v.getTag.call(this,a)),x<24?c[o++]=192|x:x<256?(c[o++]=216,c[o++]=x):x<65536?(c[o++]=217,c[o++]=x>>8,c[o++]=x&255):x>-1&&(c[o++]=218,L.setUint32(o,x),o+=4),v.encode.call(this,a,k,de);return}}if(a[Symbol.iterator]){if(pt){let u=new Error("Iterable should be serialized as iterator");throw u.iteratorNotHandled=!0,u}c[o++]=159;for(let u of a)k(u);c[o++]=255;return}if(a[Symbol.asyncIterator]||yt(a)){let u=new Error("Iterable/blob should be serialized as iterator");throw u.iteratorNotHandled=!0,u}if(this.useToJSON&&a.toJSON){const u=a.toJSON();if(u!==a)return k(u)}V(a)}}else if(g==="boolean")c[o++]=a?245:244;else if(g==="bigint"){if(a<BigInt(1)<<BigInt(64)&&a>=0)c[o++]=27,L.setBigUint64(o,a);else if(a>-(BigInt(1)<<BigInt(64))&&a<0)c[o++]=59,L.setBigUint64(o,-a-BigInt(1));else if(this.largeBigIntToFloat)c[o++]=251,L.setFloat64(o,Number(a));else{a>=BigInt(0)?c[o++]=194:(c[o++]=195,a=BigInt(-1)-a);let h=[];for(;a;)h.push(Number(a&BigInt(255))),a>>=BigInt(8);wt(new Uint8Array(h.reverse()),de);return}o+=8}else if(g==="undefined")c[o++]=247;else throw new Error("Unknown type: "+g)},V=this.useRecords===!1?this.variableMapSize?a=>{let g=Object.keys(a),d=Object.values(a),h=g.length;if(h<24?c[o++]=160|h:h<256?(c[o++]=184,c[o++]=h):h<65536?(c[o++]=185,c[o++]=h>>8,c[o++]=h&255):(c[o++]=186,L.setUint32(o,h),o+=4),p.keyMap)for(let u=0;u<h;u++)k(p.encodeKey(g[u])),k(d[u]);else for(let u=0;u<h;u++)k(g[u]),k(d[u])}:a=>{c[o++]=185;let g=o-r;o+=2;let d=0;if(p.keyMap)for(let h in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(h))&&(k(p.encodeKey(h)),k(a[h]),d++);else for(let h in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(h))&&(k(h),k(a[h]),d++);c[g+++r]=d>>8,c[g+r]=d&255}:(a,g)=>{let d,h=i.transitions||(i.transitions=Object.create(null)),u=0,b=0,S,v;if(this.keyMap){v=Object.keys(a).map(T=>this.encodeKey(T)),b=v.length;for(let T=0;T<b;T++){let Rt=v[T];d=h[Rt],d||(d=h[Rt]=Object.create(null),u++),h=d}}else for(let T in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(T))&&(d=h[T],d||(h[J]&1048576&&(S=h[J]&65535),d=h[T]=Object.create(null),u++),h=d,b++);let x=h[J];if(x!==void 0)x&=65535,c[o++]=217,c[o++]=x>>8|224,c[o++]=x&255;else if(v||(v=h.__keys__||(h.__keys__=Object.keys(a))),S===void 0?(x=i.nextId++,x||(x=0,i.nextId=1),x>=sr&&(i.nextId=(x=E)+1)):x=S,i[x]=v,x<E){c[o++]=217,c[o++]=x>>8|224,c[o++]=x&255,h=i.transitions;for(let T=0;T<b;T++)(h[J]===void 0||h[J]&1048576)&&(h[J]=x),h=h[v[T]];h[J]=x|1048576,n=!0}else{if(h[J]=x,L.setUint32(o,3655335680),o+=3,u&&(Ee+=Y*u),Z.length>=sr-E&&(Z.shift()[J]=void 0),Z.push(h),Q(b+2),k(57344+x),k(v),g)return;for(let T in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(T))&&k(a[T]);return}if(b<24?c[o++]=128|b:Q(b),!g)for(let T in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(T))&&k(a[T])},de=a=>{let g;if(a>16777216){if(a-r>nr)throw new Error("Encoded buffer would be larger than maximum buffer size");g=Math.min(nr,Math.round(Math.max((a-r)*(a>67108864?1.25:2),4194304)/4096)*4096)}else g=(Math.max(a-r<<2,c.length-1)>>12)+1<<12;let d=new ht(g);return L=new DataView(d.buffer,0,g),c.copy?c.copy(d,0,r,a):d.set(c.slice(r,a)),o-=r,r=0,re=d.length-10,c=d};let ne=100,It=1e3;this.encodeAsIterable=function(a,g){return Ot(a,g,he)},this.encodeAsAsyncIterable=function(a,g){return Ot(a,g,Tt)};function*he(a,g,d){let h=a.constructor;if(h===Object){let u=p.useRecords!==!1;u?V(a,!0):or(Object.keys(a).length,160);for(let b in a){let S=a[b];u||k(b),S&&typeof S=="object"?g[b]?yield*he(S,g[b]):yield*We(S,g,b):k(S)}}else if(h===Array){let u=a.length;Q(u);for(let b=0;b<u;b++){let S=a[b];S&&(typeof S=="object"||o-r>ne)?g.element?yield*he(S,g.element):yield*We(S,g,"element"):k(S)}}else if(a[Symbol.iterator]&&!a.buffer){c[o++]=159;for(let u of a)u&&(typeof u=="object"||o-r>ne)?g.element?yield*he(u,g.element):yield*We(u,g,"element"):k(u);c[o++]=255}else yt(a)?(or(a.size,64),yield c.subarray(r,o),yield a,Se()):a[Symbol.asyncIterator]?(c[o++]=159,yield c.subarray(r,o),yield a,Se(),c[o++]=255):k(a);d&&o>r?yield c.subarray(r,o):o-r>ne&&(yield c.subarray(r,o),Se())}function*We(a,g,d){let h=o-r;try{k(a),o-r>ne&&(yield c.subarray(r,o),Se())}catch(u){if(u.iteratorNotHandled)g[d]={},o=r+h,yield*he.call(this,a,g[d]);else throw u}}function Se(){ne=It,p.encode(null,mt)}function Ot(a,g,d){return g&&g.chunkThreshold?ne=It=g.chunkThreshold:ne=100,a&&typeof a=="object"?(p.encode(null,mt),d(a,p.iterateProperties||(p.iterateProperties={}),!0)):[p.encode(a)]}async function*Tt(a,g){for(let d of he(a,g,!0)){let h=d.constructor;if(h===rr||h===Uint8Array)yield d;else if(yt(d)){let u=d.stream().getReader(),b;for(;!(b=await u.read()).done;)yield b.value}else if(d[Symbol.asyncIterator])for await(let u of d)Se(),u?yield*Tt(u,g.async||(g.async={})):yield p.encode(u);else yield d}}}useBuffer(e){c=e,L=new DataView(c.buffer,c.byteOffset,c.byteLength),o=0}clearSharedData(){this.structures&&(this.structures=[]),this.sharedValues&&(this.sharedValues=void 0)}updateSharedData(){let e=this.sharedVersion||0;this.sharedVersion=e+1;let r=this.structures.slice(0),s=new ar(r,this.sharedValues,this.sharedVersion),n=this.saveShared(s,i=>(i&&i.version||0)==e);return n===!1?(s=this.getShared()||{},this.structures=s.structures||[],this.sharedValues=s.packedValues,this.sharedVersion=s.version,this.structures.nextId=this.structures.length):r.forEach((i,l)=>this.structures[l]=i),n}}function or(t,e){t<24?c[o++]=e|t:t<256?(c[o++]=e|24,c[o++]=t):t<65536?(c[o++]=e|25,c[o++]=t>>8,c[o++]=t&255):(c[o++]=e|26,L.setUint32(o,t),o+=4)}class ar{constructor(e,r,s){this.structures=e,this.packedValues=r,this.version=s}}function Q(t){t<24?c[o++]=128|t:t<256?(c[o++]=152,c[o++]=t):t<65536?(c[o++]=153,c[o++]=t>>8,c[o++]=t&255):(c[o++]=154,L.setUint32(o,t),o+=4)}const on=typeof Blob>"u"?function(){}:Blob;function yt(t){if(t instanceof on)return!0;let e=t[Symbol.toStringTag];return e==="Blob"||e==="File"}function $e(t,e){switch(typeof t){case"string":if(t.length>3){if(e.objectMap[t]>-1||e.values.length>=e.maxValues)return;let s=e.get(t);if(s)++s.count==2&&e.values.push(t);else if(e.set(t,{count:1}),e.samplingPackedValues){let n=e.samplingPackedValues.get(t);n?n.count++:e.samplingPackedValues.set(t,{count:1})}}break;case"object":if(t)if(t instanceof Array)for(let s=0,n=t.length;s<n;s++)$e(t[s],e);else{let s=!e.encoder.useRecords;for(var r in t)t.hasOwnProperty(r)&&(s&&$e(r,e),$e(t[r],e))}break;case"function":console.log(t)}}const an=new Uint8Array(new Uint16Array([1]).buffer)[0]==1;tr=[Date,Set,Error,RegExp,fe,ArrayBuffer,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array,typeof BigUint64Array>"u"?function(){}:BigUint64Array,Int8Array,Int16Array,Int32Array,typeof BigInt64Array>"u"?function(){}:BigInt64Array,Float32Array,Float64Array,ar],dt=[{tag:1,encode(t,e){let r=t.getTime()/1e3;(this.useTimestamp32||t.getMilliseconds()===0)&&r>=0&&r<4294967296?(c[o++]=26,L.setUint32(o,r),o+=4):(c[o++]=251,L.setFloat64(o,r),o+=8)}},{tag:258,encode(t,e){let r=Array.from(t);e(r)}},{tag:27,encode(t,e){e([t.name,t.message])}},{tag:27,encode(t,e){e(["RegExp",t.source,t.flags])}},{getTag(t){return t.tag},encode(t,e){e(t.value)}},{encode(t,e,r){wt(t,r)}},{getTag(t){if(t.constructor===Uint8Array&&(this.tagUint8Array||Me&&this.tagUint8Array!==!1))return 64},encode(t,e,r){wt(t,r)}},X(68,1),X(69,2),X(70,4),X(71,8),X(72,1),X(77,2),X(78,4),X(79,8),X(85,4),X(86,8),{encode(t,e){let r=t.packedValues||[],s=t.structures||[];if(r.values.length>0){c[o++]=216,c[o++]=51,Q(4);let n=r.values;e(n),Q(0),Q(0),packedObjectMap=Object.create(sharedPackedObjectMap||null);for(let i=0,l=n.length;i<l;i++)packedObjectMap[n[i]]=i}if(s){L.setUint32(o,3655335424),o+=3;let n=s.slice(0);n.unshift(57344),n.push(new fe(t.version,1399353956)),e(n)}else e(new fe(t.version,1399353956))}}];function X(t,e){return!an&&e>1&&(t-=4),{tag:t,encode:function(s,n){let i=s.byteLength,l=s.byteOffset||0,y=s.buffer||s;n(Me?je.from(y,l,i):new Uint8Array(y,l,i))}}}function wt(t,e){let r=t.byteLength;r<24?c[o++]=64+r:r<256?(c[o++]=88,c[o++]=r):r<65536?(c[o++]=89,c[o++]=r>>8,c[o++]=r&255):(c[o++]=90,L.setUint32(o,r),o+=4),o+r>=c.length&&e(o+r),c.set(t.buffer?t:new Uint8Array(t),o),o+=r}function cn(t,e){let r,s=e.length*2,n=t.length-s;e.sort((i,l)=>i.offset>l.offset?1:-1);for(let i=0;i<e.length;i++){let l=e[i];l.id=i;for(let y of l.references)t[y++]=i>>8,t[y]=i&255}for(;r=e.pop();){let i=r.offset;t.copyWithin(i+s,i,n),s-=2;let l=i+s;t[l++]=216,t[l++]=28,n=i}return t}function cr(t,e){L.setUint32(j.position+t,o-j.position-t+1);let r=j;j=null,e(r[0]),e(r[1])}let gt=new ir({useRecords:!1});const ln=gt.encode;gt.encodeAsIterable,gt.encodeAsAsyncIterable;const lr=512,fn=1024,mt=2048;class un extends Vr{constructor(e){e||(e={}),e.objectMode=!0,super(e),e.structures=[],this.decoder=e.decoder||new be(e)}_transform(e,r,s){this.incompleteBuffer&&(e=Buffer.concat([this.incompleteBuffer,e]),this.incompleteBuffer=null);let n;try{n=this.decoder.decodeMultiple(e)}catch(i){if(i.incomplete)this.incompleteBuffer=e.slice(i.lastPosition),n=i.values;else return s(i)}finally{for(let i of n||[])i===null&&(i=this.getNullValue()),this.push(i)}s()}getNullValue(){return Symbol.for(null)}}const dn=process.env.CBOR_NATIVE_ACCELERATION_DISABLED!==void 0&&process.env.CBOR_NATIVE_ACCELERATION_DISABLED.toLowerCase()==="true";if(!dn){let t;try{typeof require=="function"?t=require("cbor-extract"):t=Kr(import.meta.url)("cbor-extract"),t&&Ws(t.extractStrings)}catch{}}const fr=["light","dark"],ur=["xs","s","m","l","xl","xxl","xxxl"];function hn(t){return{adbShellCommand:t.android?.shell,appearance:t.appearance,deviceType:t.id,disableVirtualKeyboard:t.android?.softKeyboard===!1?!0:void 0,fontSize:t.fontSize,iosAutocorrect:t.ios?.autocorrect,iosKeyboard:t.ios?.keyboards,language:t.locale,locale:t.locale,location:t.location&&[t.location.latitude,t.location.longitude],orientation:t.orientation,osVersion:t.osVersion,timezone:t.timezone}}const dr=["grant"];function pn(t){return{grantPermissions:t?.permissions==="grant"?!0:void 0,launchApp:t?.app,launchArgs:t?.ios?.args,launchUrl:t?.url,params:t?.params}}class hr extends Error{code;issues;constructor(e,r,s=[]){super(r),this.name="SessionRequestError",this.code=e,this.issues=s}}const P=t=>`expected ${t}`,ge=t=>m.string(P(t)).check(m.minLength(1,P(t))),Ue=t=>m.literal(t,P(`one of ${t.join(", ")}`)),me=t=>m.object(t,P("an object")),pr=()=>m.boolean(P("true or false")),yr=t=>m.number(P("a number")).check(m.gte(-t,P(`at least -${String(t)}`)),m.lte(t,P(`at most ${String(t)}`))),yn=/^\w{2}(?:_\w{2})?@sw(=[\w-]+)?$/,wn=/^[a-z0-9_.=:/ ()"-]+$/i,gn='letters, digits or _ . = : / ( ) " - and spaces',mn=/^[A-Za-z]{2,3}([-_][A-Za-z0-9]{2,8})*$/;function bn(t){if(!mn.test(t))return!1;try{return new Intl.Locale(t.replaceAll("_","-")),!0}catch{return!1}}function En(t){try{return new Intl.DateTimeFormat(void 0,{timeZone:t}),!0}catch{return!1}}const bt={code:"needsTarget"},wr={code:"needsLaunchApp"},Et="has no effect without a target",gr="has no effect without a target, or with launch.app: false";function mr({launch:t}){return t?.app!==!1}const Sn=m.object({apiToken:m.optional(ge("an API token")),codec:m.optional(Ue(es)),device:me({android:m.optional(me({shell:m.optional(ge("a shell command")),softKeyboard:m.optional(pr())})),appearance:m.optional(Ue(fr)),fontSize:m.optional(Ue(ur)),id:ge("a device id"),ios:m.optional(me({autocorrect:m.optional(pr()),keyboards:m.optional(m.array(m.string(P("a keyboard layout")).check(m.regex(yn,P("a layout like en_US@sw=QWERTY"))),P("a list of keyboard layouts")))})),locale:m.optional(m.string(P("a BCP 47 tag, e.g. fr-CA")).check(m.refine(bn,{error:P("a BCP 47 tag, e.g. fr-CA")}))),location:m.optional(me({latitude:yr(90),longitude:yr(180)})),orientation:m.optional(Ue(_t)),osVersion:m.optional(ge("an OS version")),timezone:m.optional(m.string(P("an IANA timezone")).check(m.refine(En,{error:P("an IANA timezone, e.g. America/Toronto")})))}),endpoint:m.optional(m.url(P("a URL"))),launch:m.optional(me({app:m.optional(m.union([ge("an app id"),m.literal(!1)],P("an app id or false"))),ios:m.optional(me({args:m.optional(m.array(m.string(P("an argument")).check(m.regex(wn,P(gn))),P("a list of arguments")).check(m.maxLength(20,P("at most 20 arguments"))))})),params:m.optional(m.custom(t=>typeof t=="object"&&t!==null&&!Array.isArray(t),P("an object"))),permissions:m.optional(Ue(dr)),url:m.optional(m.url(P("a URL")))})),proxy:m.optional(m.union([m.literal("intercept"),m.templateLiteral(["http://",m.string()])],P("intercept or an http:// URL"))),target:m.optional(ge("an app, build or group id"))}).check(m.refine(t=>t.device.android?.shell===void 0||t.target!==void 0,{error:Et,params:bt,path:["device","android","shell"]}),m.refine(t=>t.launch?.app===void 0||t.target!==void 0,{error:Et,params:bt,path:["launch","app"]}),m.refine(t=>t.launch?.permissions===void 0||t.target!==void 0,{error:Et,params:bt,path:["launch","permissions"]}),m.refine(t=>t.launch?.params===void 0||t.target!==void 0&&mr(t),{error:gr,params:wr,path:["launch","params"]}),m.refine(t=>t.launch?.ios?.args===void 0||t.target!==void 0&&mr(t),{error:gr,params:wr,path:["launch","ios","args"]}));function vn(t){if(t.code==="custom"){const e=t.params?.code;if(e==="needsTarget"||e==="needsLaunchApp")return e}return"invalidValue"}function An(t){const e=Sn.safeParse(t);if(e.success)return;const r=e.error.issues.map(s=>({code:vn(s),message:s.message,path:s.path.join(".")}));throw new hr("invalid",r.map(({message:s,path:n})=>`${n}: ${s}`).join(`
2
- `),r)}const xn={dateStyle:"medium",timeStyle:"short"},kn=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})$/;function Ve(t){return Array.isArray(t)?t.map(Ve).join(", "):typeof t=="boolean"?t?"yes":"no":typeof t=="number"?t.toLocaleString():In(t)}function In(t){if(kn.test(t)){const r=new Date(t);if(!Number.isNaN(r.getTime()))return r.toLocaleString(void 0,xn)}const e=Ut();return t===e?"~":t.startsWith(`${e}${$r}`)?`~${t.slice(e.length)}`:t}function br(){return process.env.APPETIZE_CLI_HOME??ie(Ut(),".appetize","cli","sessions")}function St(t){return ie(br(),t)}class Ke extends Error{details;constructor(e,r={},s){super(e,s===void 0?void 0:{cause:s}),this.name="CommandError",this.details=r}hints(e){return[]}}class Ce extends Ke{sessionDir;constructor(e,{cause:r,details:s={},sessionId:n}){const i=St(n);super(e,Object.assign({sessionDir:i},s),r),this.name="SessionError",this.sessionDir=i}static wrap(e,r){if(e instanceof Ce||e instanceof se)return e;const s=e instanceof Error?e.message:String(e),n=e instanceof Ke?e.details:{};return new Ce(s,{cause:e,details:n,sessionId:r})}hints(){return[`Check the session logs for details: ${Ve(this.sessionDir)}`]}}class On extends Ce{constructor(e){super(`Session ${e} already exists`,{sessionId:e}),this.name="SessionAlreadyExistsError"}hints(){return[`Pass --force to replace it, deleting ${Ve(this.sessionDir)}`]}}class se extends Ke{#e;constructor(e,r=[]){super(e),this.name="UsageError",this.#e=r}hints({command:e}){return[...this.#e,`Run 'appetize ${e} --help' for usage`]}}function Tn(t,e,r){const s=e instanceof Error?e.message:String(e);if(!(e instanceof Ke))return t==="json"?JSON.stringify({error:{message:s}},null,2):`\u2716 ${s}`;const n=e.hints(r);if(t==="json"){const i=n.length>0?{hints:n}:{};return JSON.stringify({error:{message:s,...e.details,...i}},null,2)}return[`\u2716 ${s}`,...n.map(i=>` ${i}`)].join(`
3
- `)}function vt(t){try{return process.kill(t,0),!0}catch{return!1}}const Rn=["SIGINT","SIGTERM"],Mn=150;function Un(t){const e=new AbortController,r=setInterval(()=>{vt(t)||(clearInterval(r),e.abort(new Error("The device session exited")))},Mn);return r.unref(),e.signal}function Er(){const t=new AbortController;for(const e of Rn)process.once(e,()=>{t.abort(new Error(`Received ${e}`))});return t.signal}function Ln(t,e){return new Promise((r,s)=>{if(e.aborted){s(Sr(e.reason));return}const n=()=>{clearTimeout(i),s(Sr(e.reason))},i=setTimeout(()=>{e.removeEventListener("abort",n),r()},t);e.addEventListener("abort",n,{once:!0})})}function Sr(t){return t instanceof Error?t:new Error(String(t))}function Cn(t){return Object.values(t).some(e=>e!==void 0)?t:void 0}function Pn(t,{defaultValue:e=!1}={}){return t===!e?!e:void 0}function _n(t,e,r){const s=qe(t,r);if(s===void 0)return;const n=e.find(i=>i===s);if(n===void 0)throw new se(`${r} expects one of ${e.join(", ")}`);return n}function Nn(t){const e=t.at(-1);return{options:zn(e)?e:{},positionals:t.slice(0,-1).filter(r=>typeof r=="string"),signal:Er()}}function Dn(t,e){const r=vr(t,e);return r===void 0?void 0:Ar(r,e)}function vr(t,e){if(t===void 0)return;const r=typeof t=="boolean"?Number.NaN:Number(t);if(!Number.isFinite(r))throw new se(`${e} expects a number, e.g., ${e}=-0.1`);return r}function Bn(t,e){return t===void 0?void 0:(Array.isArray(t)?t:[t]).map(s=>xr(s,e))}function qe(t,e){if(t!==void 0){if(typeof t!="string"||t==="")throw new se(`${e} needs a value`);return t}}function Ar(t,e){if(!(t>=0&&t<=1))throw new se(`${e} expects a number between 0 and 1`);return t}function xr(t,e){const r=qe(t,e);if(r===void 0)throw new se(`${e} needs a value`);return r}function zn(t){return typeof t=="object"&&t!==null}const Fn="APPETIZEIO_FEATURE_FLAGS";function jn(){const t={};for(const e of(process.env[Fn]??"").split(",")){const r=e.trim();r!==""&&(t[r]=!0)}return t}function $n(){const t=process.env.APPETIZE_API_TOKEN;if(!t)throw new Error("APPETIZE_API_TOKEN must be set");return t}function kr(t){return qe(t.endpoint,"--endpoint")??Vn()}function Vn(){const t=process.env.APPETIZE_ENDPOINT?.trim();return t===""?void 0:t}const Kn="https://appetize.io";async function Ir(t,{authorize:e=!0,commandOptions:r={},query:s={},...n}={}){const i=new URL(t,kr(r)??Kn);for(const[p,A]of Object.entries(s))i.searchParams.set(p,A);const l=new Headers(n.headers);e&&l.set("x-api-key",$n());const y=await fetch(i,{...n,headers:l});if(!y.ok)throw new Error(await Wn(y));return await y.json()}function qn(t){if(!(typeof t!="object"||t===null||!("message"in t)))return typeof t.message=="string"?t.message:void 0}async function Wn(t){const e=`The webserver rejected the request (${String(t.status)})`,r=await t.json().catch(()=>{}),s=qn(r);return s?`${e}: ${s}`:e}const Or=["android","ios"];function Tr(t={},e){return Ir("/api/v2/service/devices",{authorize:!1,commandOptions:t,signal:e})}function Jn(t){return Or.includes(t)}async function Gn(t,e={}){return(await Tr(e)).find(s=>s.id===t)?.platform}function Hn(t){let e={...t,updatedAt:new Date().toISOString()};return{path:xt(e.sessionId),save:r=>(e={...e,...r,updatedAt:new Date().toISOString()},si(e),e)}}function Rr(t){const e=t.state?.phase;return e==="ended"||e==="error"?!1:vt(t.pid)}function Zn(){const t=br();return Mt(t,{recursive:!0}),jr(t).map(e=>At(e)).filter(e=>e!==void 0)}function Yn(t){if(t!==void 0){const r=At(t);if(!r)throw new Error(`No session found for id ${t}`);return r}const e=Zn().filter(Rr);if(e.length===0)throw new Error("No active sessions");if(e.length>1)throw new se("There are multiple active sessions",["Specify --session-id to pick one"]);return e[0]}function At(t){try{return JSON.parse(zr(xt(t),"utf8"))}catch{return}}function Qn(t){Fr(St(t),{force:!0,recursive:!0})}function Xn(t){return ie(Le(t),"control.sock")}function Mr(t){return ie(Le(t),"daemon.log")}function ei(t){return ie(Le(t),"device.log.jsonl")}function ti(t,e){return{daemon:Mr(t),device:ei(t),...e==="intercept"?{network:ri(t)}:void 0}}function ri(t){return ie(Le(t),"network.jsonl")}function Le(t){const e=St(t);return Mt(e,{recursive:!0}),e}function xt(t){return ie(Le(t),"state.json")}function si(t){const e=xt(t.sessionId),r=`${e}.tmp`;Dr(r,`${JSON.stringify(t,null,2)}
4
- `),Br(r,e)}const kt="APPETIZE_DAEMON_CONFIG";function ni(){const t=process.env[kt];if(!t)throw new Error(`${kt} is not set`);return JSON.parse(t)}function ii(t){return JSON.stringify(t)}function oi(){let t,e;return{promise:new Promise((s,n)=>{e=s,t=n}),reject:t,resolve:e}}const Ur={useRecords:!1},ai=new ir(Ur);class Lr extends ve{#e=[];#t;constructor(e,{signal:r}={}){super(async l=>{this.#t.write(ai.encode(l))},{signal:r}),this.#t=e;const s=new un(Ur);s.on("data",l=>{Qe(l)&&this[U].dispatchMessage(l)}),s.on("error",()=>{this.close()});const n=l=>{s.write(l)},i=()=>{this.close()};e.on("data",n),e.once("close",i),e.once("error",i),this.#e.push(()=>{e.off("data",n),e.off("close",i),e.off("error",i),s.destroy()})}handleClose(e){for(const r of this.#e.splice(0))r();super.handleClose(e)}}function ci(t,e){const{promise:r,reject:s,resolve:n}=oi(),i=qr(t),l=e?.signal,y=()=>{i.off("connect",E),i.off("error",R),l?.removeEventListener("abort",A)},p=M=>{y(),i.destroy(),s(M)},A=()=>{p(new Error("The connection was aborted"))},E=()=>{y();const M=new Lr(i,e);M[U].addEventListener("close",()=>{i.destroy()},{once:!0}),n(M)},R=M=>{p(M)};return l?.aborted?(p(new Error("The connection was aborted")),r):(i.once("connect",E),i.once("error",R),l?.addEventListener("abort",A,{once:!0}),r)}export{Lr as $,kr as A,At as B,On as C,kt as D,Qn as E,ti as F,Dn as G,Ve as H,ci as I,Fs as J,Ct as K,Yn as L,Nn as M,Tn as N,Ze as O,ln as P,U as Q,rn as R,Ce as S,ve as T,se as U,Qe as V,Vt as W,Ne as X,pn as Y,hn as Z,He as _,vr as a,ni as a0,Hn as a1,Gn as a2,Xn as a3,Er as a4,Tr as b,Or as c,Ln as d,jt as e,Ir as f,xr as g,_t as h,Jn as i,Mr as j,Rr as k,vt as l,Un as m,Cn as n,Pn as o,qe as p,Bn as q,Ar as r,ii as s,_n as t,ur as u,fr as v,dr as w,An as x,hr as y,jn as z};