ugly-app 0.1.728 → 0.1.730
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/inspect/host-bundle.js +4 -4
- package/dist/native/facades/browser.d.ts +19 -0
- package/dist/native/facades/browser.d.ts.map +1 -1
- package/dist/native/facades/browser.js +1 -0
- package/dist/native/facades/browser.js.map +1 -1
- package/dist/native/proxy.d.ts.map +1 -1
- package/dist/native/proxy.js +26 -0
- package/dist/native/proxy.js.map +1 -1
- package/dist/native/proxyClient.d.ts +7 -0
- package/dist/native/proxyClient.d.ts.map +1 -1
- package/dist/native/proxyClient.js +9 -3
- package/dist/native/proxyClient.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/native/facades/browser.ts +22 -0
- package/src/native/proxy.ts +24 -0
- package/src/native/proxyClient.ts +15 -1
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.730";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{function Pe(e){let t=e.url??"/ws",n=t.startsWith("/")?typeof window<"u"?`${window.location.protocol==="https:"?"wss":"ws"}://${window.location.host}${t}`:`ws://localhost:${4321}${t}`:t,r=0;function o(){return String(++r)}let c=new Map,i=null,d=!1,m=!1,g=!1,a=0,y=!1,k=!1,l=e.initialFocus??!0,h=e.keepConnectedWhenUnfocused??!1,v=null,E=!1,M=0,x="connecting",te=1e3,pt=3e4,mt=5,me=1e3,ne=!1,gt=3e4,re=null,ge=null,yt=null,oe=null,_=null,ie=[],se=[],b=new Map,I=new Map,z=new Map;function ce(){re=new Promise((u,s)=>{ge=u,yt=s}),re.catch(()=>{})}ce();function W(u,s){x=u,typeof window<"u"&&window.dispatchEvent(new CustomEvent("ws-connection-state",{detail:{state:u,...s}}))}function wt(u){for(let{reject:s,timeout:f}of b.values())clearTimeout(f),s(new Error(u));b.clear(),I.clear(),z.clear()}function ae(u){for(let[s,f]of b)clearTimeout(f.timeout),f.retry?we(se,s):(b.delete(s),f.reject(new Error(u?"WebSocket disconnected (idle)":"WebSocket disconnected")))}function ye(u){i.send(JSON.stringify(u))}function we(u,s){u.length>=me&&(u.shift(),ne||(console.warn(`[socket] queue exceeded ${me} \u2014 dropping oldest message(s)`),ne=!0)),u.push(s)}function V(u){g&&d&&i?.readyState===WebSocket.OPEN?i.send(u):we(ie,u)}function ke(u,s,f=6e4,p=!0){if(typeof u=="object"&&u!==null){V(JSON.stringify(u));return}return new Promise((w,R)=>{let T=o(),P=JSON.stringify({type:u,id:T,data:s}),A=setTimeout(()=>{b.delete(T),R(new Error(`Request timeout: ${u}`))},f);b.set(T,{resolve:w,reject:R,timeout:A,serialized:P,retry:p,timeoutMs:f}),V(P)})}function he(u,s){V(JSON.stringify({type:u,data:s}))}function be(){B(),!(!l&&!h)&&(E=!1,v=setInterval(()=>{if(!(!d||!(l||h))){if(E){E=!1,kt();return}E=!0,he("ping",{})}},gt))}function B(){v&&(clearInterval(v),v=null)}function kt(){let u=i;if(M++,d=!1,m=!1,B(),u)try{u.removeEventListener("message",ve),u.close()}catch{}i=null,W("reconnecting",{attempt:a+1}),ae(!1),ce(),a++,X()}function ht(){for(let[u,s]of D)S(s.type,{...s.params,subId:u}).catch(f=>console.error("[resubscribe]",f))}let D=new Map;function bt(){for(;se.length>0&&i?.readyState===WebSocket.OPEN;){let u=se.shift(),s=b.get(u);s&&(i.send(s.serialized),s.timeoutMs!==null&&(s.timeout=setTimeout(()=>{b.delete(u),s.reject(new Error(`Timeout: retry ${u}`))},s.timeoutMs)))}}function vt(){for(;ie.length>0&&i?.readyState===WebSocket.OPEN;)i.send(ie.shift());bt(),e.buildId&&ke("buildId",{}).then(u=>{u!==e.buildId&&typeof window<"u"&&window.dispatchEvent(new CustomEvent("version-mismatch"))}).catch(()=>{}),y&&(ht(),y=!1)}function ue(u,s){typeof window<"u"&&window.dispatchEvent(new CustomEvent(u,{detail:s}))}function ve(u){E=!1;let s=JSON.parse(u.data,e.messageReviver);switch(s.type){case"pong":return;case"ready":g=!0,vt();return;case"authFailed":ue("auth-failed",{});return;case"track":s.subId&&I.get(s.subId)?.(s.data);return;case"frame":s.subId&&z.get(s.subId)?.(s.data);return;case"response":if(s.id){let f=b.get(s.id);f&&(clearTimeout(f.timeout),b.delete(s.id),f.resolve(s.data??s.result))}return;case"pushNotification":ue("push-notification-received",s.data);return;case"server-draining":ue("server-draining",s.data);return;default:{if(s.id&&s.type==="error"){let p=b.get(s.id);p&&(clearTimeout(p.timeout),b.delete(s.id),p.reject(new Error(s.error??"Unknown error")));return}if(s.id){let p=b.get(s.id);if(p){clearTimeout(p.timeout),b.delete(s.id),p.resolve(s.data??s.result);return}}e.onCustomMessage?.(s);let f=c.get(s.type);if(f)for(let p of f)p(s.data)}}}function S(u,s,f=6e4,p=!1){return new Promise((w,R)=>{let T=o(),P=JSON.stringify({id:T,type:u,payload:s}),A=f===null?null:setTimeout(()=>{b.delete(T),R(new Error(`Timeout: ${u}`))},f);b.set(T,{resolve:w,reject:R,timeout:A??setTimeout(()=>{},0),serialized:P,retry:p,timeoutMs:f}),V(P)})}function Se(u){if(u!==l)if(l=u,u)d?be():(a=0,X());else{if(h)return;B(),k=!0}}typeof document<"u"&&(l=document.visibilityState==="visible",document.addEventListener("visibilitychange",()=>{Se(document.visibilityState==="visible")}));function X(){if(m)return;m=!0,g=!1;let u=++M,s=new URL(n,typeof window<"u"?window.location.href:void 0);if(e.getUrlParams)for(let[f,p]of Object.entries(e.getUrlParams()))s.searchParams.set(f,p);i=new WebSocket(s.toString()),i.addEventListener("message",ve),i.addEventListener("open",()=>{m=!1;let f=a>0,p=k;if(d=!0,y=f||p,a=0,ne=!1,k=!1,W("connected",{wasReconnect:f,wasIdleReconnect:p}),ge?.(),l&&be(),oe){let w;_!==null&&b.has(_)?w=_:(w=o(),b.set(w,{resolve:()=>{},reject:()=>{},timeout:setTimeout(()=>b.delete(w),3e4),serialized:"",retry:!1,timeoutMs:3e4})),_=null,ye({id:w,type:"auth",payload:{token:oe}})}}),i.addEventListener("close",()=>{if(u!==M)return;if(m=!1,d=!1,B(),!l&&!h){k=!0,W("idle-disconnected"),ae(!0);return}W("reconnecting",{attempt:a+1}),ae(!1);let f=Math.min(pt,te*Math.pow(2,Math.min(a,mt)));ce(),setTimeout(()=>{a++,X()},f)}),i.addEventListener("error",()=>{})}return X(),{connect(u){oe=u;let s=o(),f=new Promise((p,w)=>{b.set(s,{resolve:R=>{let T=R;p({user:T.user,appToken:T.appToken})},reject:w,timeout:setTimeout(()=>{b.delete(s),w(new Error("Auth timeout"))},3e4),serialized:"",retry:!1,timeoutMs:3e4})});return i?.readyState===WebSocket.OPEN?ye({id:s,type:"auth",payload:{token:u}}):_=s,f},request(u,s,f){let p=f?.timeoutMs===void 0?6e4:f.timeoutMs;return S("request",{name:u,input:s},p,f?.retry??!0)},async requestStream(u,s,f,p){let w=await fetch(`/api/${u}`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},credentials:"include",body:JSON.stringify({input:s}),...p?.signal?{signal:p.signal}:{}});if(!w.ok||!w.body){let
|
|
2
|
-
`))!==-1;){let Te=P.slice(0,le).replace(/\r$/,"");if(P=P.slice(le+1),!Te.startsWith("data:"))continue;let Re=Te.slice(5).trimStart();if(!Re)continue;let j;try{j=JSON.parse(Re)}catch{continue}if(j.type==="__result__"){A=j.result,Ee=!0;break}if(j.type==="__error__")throw new Error(j.error??`request ${u} failed`);f(j)}}return A},getDoc(u,s){return S("request",{name:"storeGetDoc",input:{collection:u,id:s}}).then(f=>f.item)},getDocs(u,s,f){return S("request",{name:"storeGetDocs",input:{collection:u,filter:s,...f}}).then(p=>p.items)},getQuery(u,s,f){return S("request",{name:"storeGetQuery",input:{collection:u,query:s,...f}}).then(p=>p.items)},trackDoc(u,s,f){let p=o();return I.set(p,f),D.set(p,{type:"trackDoc",params:{collection:u,id:s}}),S("trackDoc",{collection:u,id:s,subId:p}).catch(w=>{console.error("[trackDoc]",w)}),()=>{I.delete(p),D.delete(p),S("unsubscribe",{subId:p}).catch(()=>{})}},trackDocs(u,s,f,p){let w=o();return I.set(w,f),p&&z.set(w,p),D.set(w,{type:"trackDocs",params:{collection:u,keys:s.keys,filter:s.filter,sort:s.sort,limit:s.limit,skip:s.skip}}),S("trackDocs",{collection:u,keys:s.keys,filter:s.filter,subId:w,sort:s.sort,limit:s.limit,skip:s.skip}).catch(R=>{console.error("[trackDocs]",R)}),()=>{I.delete(w),z.delete(w),D.delete(w),S("unsubscribe",{subId:w}).catch(()=>{})}},find(u,s,f){return S("request",{name:"storeGetDocs",input:{collection:u,filter:s,...f}}).then(p=>p.items)},trackQuery(u,s,f){let p=o();return I.set(p,f),D.set(p,{type:"trackQuery",params:{collection:u,keys:s.keys,filter:s.filter,sort:s.sort,limit:s.limit,skip:s.skip}}),S("trackQuery",{collection:u,keys:s.keys,filter:s.filter,subId:p,sort:s.sort,limit:s.limit,skip:s.skip}).catch(w=>{console.error("[trackQuery]",w)}),()=>{I.delete(p),D.delete(p),S("unsubscribe",{subId:p}).catch(()=>{})}},async uploadFile(u,s){let{uploadUrl:f,resultUrl:p}=await S("request",{name:"uploadUrl",input:{key:s,contentType:u.type}}),w=await fetch(f,{method:"PUT",body:u,headers:{"Content-Type":u.type}});if(!w.ok)throw new Error(`Upload failed: ${w.status} ${w.statusText}`);return p},emit:he,send:ke,on(u,s){let f=c.get(u);return f||(f=new Set,c.set(u,f)),f.add(s),()=>{f.delete(s),f.size===0&&c.delete(u)}},waitForConnection(u=3e4){return d?Promise.resolve():new Promise((s,f)=>{let p=setTimeout(()=>f(new Error("Connection timeout")),u);re?.then(()=>{clearTimeout(p),s()}).catch(w=>{clearTimeout(p),f(w instanceof Error?w:new Error(String(w)))})})},get connectionState(){return x},setFocused(u){Se(u)},disconnect(){wt("Disconnected"),B(),i?.close(),i=null}}}var dn=new TextEncoder;function K(e){let t=/a=fingerprint:(\S+)\s+([0-9A-Fa-f:]+)/.exec(e||"");return t?`${t[1].toLowerCase()} ${t[2].toUpperCase()}`:null}function xe(e){return e??{}}function Ce(e){let t=e.rtcFactory??(g=>new RTCPeerConnection(g)),n=new Map,r=new Set,o=[];async function c(g){let a=String(g.from??"");if(!a)return;let y=String(g.sdp??""),k=String(g.origin??"");if(e.signer&&!await e.signer.verify("client",K(y)??"",String(g.fpTag??""))){e.socket.emit("rtc:error",{to:a,reason:"fingerprint-auth-failed"});return}try{n.get(a)?.pc.close()}catch{}let l=t({iceServers:e.iceServers??[]}),h={pc:l,dc:null,origin:k};n.set(a,h),l.onicecandidate=x=>{x.candidate&&e.socket.emit("rtc:ice",{to:a,candidate:x.candidate.toJSON()})},l.ondatachannel=x=>{h.dc=x.channel,x.channel.onmessage=te=>{d(h,x.channel,te.data)}},await l.setRemoteDescription({type:"offer",sdp:y});let v=await l.createAnswer();await l.setLocalDescription(v);let E=l.localDescription?.sdp??v.sdp??"",M=e.signer?await e.signer.sign("host",K(E)??""):void 0;e.socket.emit("rtc:answer",{to:a,sdp:E,fpTag:M})}async function i(g){let a=n.get(String(g.from??""));if(a)try{await a.pc.addIceCandidate(g.candidate)}catch{}}async function d(g,a,y){let k;try{k=JSON.parse(typeof y=="string"?y:new TextDecoder().decode(y))}catch{return}if(k.t==="req"&&k.id!==void 0)try{let l=await e.onInvoke(String(k.channel),k.payload,g.origin);m(a,{t:"res",id:k.id,ok:!0,result:l})}catch(l){m(a,{t:"res",id:k.id,ok:!1,error:String(l?.message??l)})}else if(k.t==="sub"&&k.id!==void 0)r.add({dc:a,event:String(k.channel??""),id:k.id}),m(a,{t:"res",id:k.id,ok:!0,result:{snapshot:null}});else if(k.t==="unsub"&&k.id!==void 0)for(let l of[...r])l.dc===a&&l.id===k.id&&r.delete(l)}function m(g,a){try{g.readyState==="open"&&g.send(JSON.stringify(a))}catch{}}return o.push(e.socket.on("rtc:offer",g=>{c(xe(g))})),o.push(e.socket.on("rtc:ice",g=>{i(xe(g))})),{stop(){for(let g of o)try{g()}catch{}for(let g of n.values())try{g.pc.close()}catch{}n.clear(),r.clear()},broadcast(g,a){for(let y of r)y.event===g&&m(y.dc,{t:"evt",event:g,data:a})},peerCount:()=>n.size}}function Ie(e){return{sign:async(t,n)=>(await e.invoke("proxy.signFingerprint",{role:t,fingerprint:n})).tag,verify:async(t,n,r)=>(await e.invoke("proxy.verifyFingerprint",{role:t,fingerprint:n,tag:r})).ok}}var F=class{constructor(t){this.cap=t}cap;items=[];push(t){this.items.push(t),this.items.length>this.cap&&this.items.splice(0,this.items.length-this.cap)}since(t,n){let r=0,o=this.items.length;for(;r<o;){let c=r+o>>>1;n(this.items[c])<t?r=c+1:o=c}return this.items.slice(r)}all(){return this.items.slice()}clear(){this.items=[]}size(){return this.items.length}};var J=class{seq=0;byId=new Map;put(t){let n=`o${++this.seq}`;return this.byId.set(n,t),n}get(t){return this.byId.get(t)}clear(){this.byId.clear()}};function Tt(e){return typeof Node<"u"&&typeof e=="object"&&e!==null&&e instanceof Node}function H(e,t){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ne(e){return Object.getPrototypeOf(e)?.constructor?.name}function C(e,t){switch(typeof e){case"undefined":return{type:"undefined"};case"boolean":return{type:"boolean",value:e};case"bigint":return{type:"bigint",value:`${e}n`,preview:`${e}n`};case"symbol":return{type:"symbol",value:String(e),preview:String(e)};case"string":return{type:"string",value:H(e,1e3)};case"number":return Number.isFinite(e)?{type:"number",value:e}:{type:"number",value:String(e),preview:String(e)};case"function":return{type:"function",className:"Function",preview:`\u0192 ${e.name||"(anonymous)"}()`};case"object":break;default:return{type:"object",preview:String(e)}}if(e===null)return{type:"null"};let n=e;if(Tt(e))return{type:"node",className:e.nodeName??"Node",preview:xt(e),nodeId:t.nodeIdFor?.(e)};if(e instanceof Date)return{type:"date",className:"Date",preview:It(e)};if(e instanceof RegExp)return{type:"regexp",className:"RegExp",preview:String(e)};if(e instanceof Error)return{type:"error",className:e.name||"Error",preview:H(`${e.name}: ${e.message}`,100),objectId:t.registry.put(e)};if(Ct(e))return{type:"promise",className:"Promise",preview:"Promise",objectId:t.registry.put(e)};if(e instanceof Map)return{type:"map",className:"Map",size:e.size,objectId:t.registry.put(e),preview:`Map(${e.size})`,entries:Oe(e,t)};if(e instanceof Set)return{type:"set",className:"Set",size:e.size,objectId:t.registry.put(e),preview:`Set(${e.size})`,entries:Ae(e,t)};if(Array.isArray(e))return{type:"array",className:"Array",size:e.length,objectId:t.registry.put(e),preview:`Array(${e.length})`,entries:De(e,t)};let r=Object.keys(n);return{type:"object",className:Ne(n)??"Object",size:r.length,objectId:t.registry.put(n),preview:Rt(n,r),entries:de(n,r,t)}}function Me(e,t){if(e instanceof Map)return Oe(e,t,1/0).map(n=>n.value);if(e instanceof Set)return Ae(e,t,1/0).map(n=>n.value);if(Array.isArray(e))return De(e,t,1/0).map(n=>n.value);if(e instanceof Error)return de({name:e.name,message:e.message,stack:e.stack},["name","message","stack"],t,1/0).map(n=>n.value);if(typeof e=="object"&&e!==null){let n=Object.keys(e);return de(e,n,t,1/0).map(r=>r.value)}return[]}function De(e,t,n=5){let r=[];for(let o=0;o<e.length&&o<n;o++)r.push({key:String(o),value:C(e[o],t)});return r}function de(e,t,n,r=5){let o=[];for(let c=0;c<t.length&&c<r;c++){let i=t[c],d;try{d=e[i]}catch{d="(getter threw)"}o.push({key:i,value:C(d,n)})}return o}function Oe(e,t,n=5){let r=[],o=0;for(let[c,i]of e){if(o++>=n)break;r.push({key:C(c,t),value:C(i,t)})}return r}function Ae(e,t,n=5){let r=[],o=0;for(let c of e){if(o++>=n)break;r.push({value:C(c,t)})}return r}function Rt(e,t){let n=t.slice(0,5).map(o=>{let c;try{c=e[o]}catch{c="\u2026"}return`${o}: ${Pt(c)}`}),r=t.length>5?", \u2026":"";return H(`{${n.join(", ")}${r}}`,100)}function Pt(e){let t=typeof e;return t==="string"?`"${H(e,20)}"`:t==="object"&&e!==null?Array.isArray(e)?`Array(${e.length})`:Ne(e)??"Object":String(e)}function xt(e){let t=e;if(t.nodeType===1){let n=(t.nodeName??"").toLowerCase(),r=t.id?`#${t.id}`:"",o=typeof t.className=="string"&&t.className?`.${t.className.trim().split(/\s+/).join(".")}`:"";return H(`<${n}${r}${o}>`,100)}return t.nodeName??"Node"}function Ct(e){return typeof e?.then=="function"}function It(e){try{return e.toISOString()}catch{return"Invalid Date"}}var je=["log","info","warn","error","debug"];function Le(e){if(typeof console>"u")return()=>{};let t=0,n={};for(let i of je){let d=console[i];typeof d=="function"&&(n[i]=d,console[i]=(...m)=>{try{c(i,m)}catch{}d.apply(console,m)})}let r=i=>{c("error",[i.message],{stack:O(i.error?.stack),source:{url:i.filename||"",line:i.lineno||0,col:i.colno||0}})},o=i=>{let d=i.reason;c("error",[`Unhandled rejection: ${d?.message??String(i.reason)}`],{stack:O(d?.stack)})};typeof window<"u"&&(window.addEventListener("error",r),window.addEventListener("unhandledrejection",o));function c(i,d,m){let g=d.map(k=>C(k,{registry:e.registry,nodeIdFor:e.nodeIdFor})),a=m?.stack??O(new Error().stack,1),y={seq:++t,ts:e.now(),level:i,args:g,text:Nt(d),stack:a.length?a:void 0,source:m?.source??a[0]?{url:a[0].url,line:a[0].line,col:a[0].col}:void 0};e.buffer.push(y),e.onEntry?.(y)}return()=>{for(let i of je){let d=n[i];d&&(console[i]=d)}typeof window<"u"&&(window.removeEventListener("error",r),window.removeEventListener("unhandledrejection",o))}}function Nt(e){return e.map(t=>{if(typeof t=="string")return t;if(t instanceof Error)return`${t.name}: ${t.message}`;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ").slice(0,2e3)}function O(e,t=0){if(!e)return[];let n=[],r=e.split(`
|
|
3
|
-
`);for(let o of r){let c=o.trim(),i=/^at\s+(.*?)\s+\((.*?):(\d+):(\d+)\)$/.exec(c)||/^at\s+(.*?):(\d+):(\d+)$/.exec(c);if(i){i.length===5?n.push({functionName:i[1],url:i[2],line:+i[3],col:+i[4]}):n.push({functionName:"(anonymous)",url:i[1],line:+i[2],col:+i[3]});continue}i=/^(.*?)@(.*?):(\d+):(\d+)$/.exec(c),i&&n.push({functionName:i[1]||"(anonymous)",url:i[2],line:+i[3],col:+i[4]})}return n.slice(t)}function
|
|
4
|
-
`)){let r=n.indexOf(":");r>0&&(t[n.slice(0,r).trim().toLowerCase()]=n.slice(r+1).trim())}return t}function ze(e){if(e!=null)return typeof e=="string"?e.slice(0,G):typeof URLSearchParams<"u"&&e instanceof URLSearchParams?e.toString().slice(0,G):"(binary)"}async function Kt(e,t){let n=e.headers.get("content-type")||"";if(!/json|text|javascript|xml|html|csv/i.test(n)){t.responseBody={kind:"omitted"};return}try{let r=await e.clone().text();t.sizeBytes=r.length;let o=/json/i.test(n)?"json":"text";t.responseBody={kind:o,data:r.slice(0,G)}}catch{t.responseBody={kind:"omitted"}}}function Jt(e){try{if(e.responseType===""||e.responseType==="text"){let t=e.responseText||"",n=e.getResponseHeader("content-type")||"";return{kind:/json/i.test(n)?"json":"text",data:t.slice(0,G)}}}catch{}return{kind:"omitted"}}var Y=class{seq=0;byId=new Map;idOf=new WeakMap;idFor(t){let n=this.idOf.get(t);if(n)return this.byId.set(n,t),n;let r=`n${++this.seq}`;return this.idOf.set(t,r),this.byId.set(r,t),r}get(t){return this.byId.get(t)}clear(){this.byId.clear()}};function Z(e){let t=e.getAttribute?.("data-id");if(t)return`[data-id=${t}]`;let n=e.getAttribute?.("role"),r=e.tagName.toLowerCase();return e.id?`${r}#${e.id}`:n?`${r}[role=${n}]`:r}var Xe="__ugly_inspect_overlay__";function Ke(e){if(typeof document>"u")return{setEnabled:()=>{},highlight:()=>{},destroy:()=>{}};let t=!1,n=null;function r(){if(n)return n;let a=document.createElement("div");return a.id=Xe,Object.assign(a.style,{position:"fixed",pointerEvents:"none",zIndex:"2147483647",background:"rgba(64,128,255,0.28)",border:"1px solid rgba(64,128,255,0.9)",boxSizing:"border-box",top:"0",left:"0",display:"none"}),document.documentElement.appendChild(a),n=a,a}function o(a){let y=r();if(!a){y.style.display="none";return}Object.assign(y.style,{display:"block",transform:`translate(${a.x}px, ${a.y}px)`,width:`${a.w}px`,height:`${a.h}px`})}let c=a=>{let y=d(a.clientX,a.clientY);y&&o(pe(y))},i=a=>{let y=d(a.clientX,a.clientY);y&&(a.preventDefault(),a.stopPropagation(),e.setPickedNode(y),e.onPicked({nodeId:e.reg.idFor(y),selector:Z(y),rect:pe(y)}),m(!1))};function d(a,y){n&&(n.style.display="none");let k=document.elementFromPoint(a,y);return k&&k.id!==Xe?k:null}function m(a){a!==t&&(t=a,a?(window.addEventListener("pointermove",c,!0),window.addEventListener("pointerdown",i,!0)):(window.removeEventListener("pointermove",c,!0),window.removeEventListener("pointerdown",i,!0),o(null)))}function g(a){if(!a){o(null);return}let y=e.reg.get(a);y?.nodeType===1&&o(pe(y))}return{setEnabled:m,highlight:g,destroy:()=>{m(!1),n?.remove(),n=null}}}function pe(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,w:t.width,h:t.height}}var Ge=4;async function Ye(e,t){let n=t(),r=[];await new Promise(c=>{let i=()=>{r.push(Qt()),t()-n>=e?c():Je(i)};Je(i)});let o=t();return{startTime:n,endTime:o,durationMs:o-n,sampleCount:r.length,precise:!1,root:Gt(r)}}function Je(e){typeof setTimeout<"u"?setTimeout(e,Ge):e()}function Qt(){return O(new Error().stack,1).filter(t=>!/profile\.(js|ts)/.test(t.url)).map(t=>({url:t.url,line:t.line,col:t.col,functionName:t.functionName})).reverse()}function Gt(e){let t=0,n=Qe(t++,"(root)");for(let r of e){let o=n;o.hitCount++;for(let c of r){let i=c,d=`${i.functionName??"(anonymous)"}@${i.url}:${i.line}`,m=o.childMap.get(d);m||(m=Qe(t++,i.functionName??"(anonymous)",{url:i.url,line:i.line,col:i.col}),o.childMap.set(d,m),o.children.push(m)),m.hitCount++,o=m}}return Ze(n,e.length),et(n)}function Qe(e,t,n){return{id:e,functionName:t,source:n,selfTimeMs:0,totalTimeMs:0,hitCount:0,children:[],childMap:new Map}}function Ze(e,t){let n=0;for(let r of e.children)n+=Ze(r,t);return e.totalTimeMs=e.hitCount*Ge,e.selfTimeMs=Math.max(0,e.totalTimeMs-n),e.totalTimeMs}function et(e){return{id:e.id,functionName:e.functionName,source:e.source,selfTimeMs:e.selfTimeMs,totalTimeMs:e.totalTimeMs,hitCount:e.hitCount,children:e.children.map(t=>et(t))}}function nt(e,t,n){if(e==="cookie"){document.cookie=`${encodeURIComponent(t)}=${encodeURIComponent(n)}; path=/`;return}ee(()=>e==="session"?sessionStorage:localStorage)?.setItem(t,n)}function rt(e,t){if(e==="cookie"){document.cookie=`${encodeURIComponent(t)}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`;return}ee(()=>e==="session"?sessionStorage:localStorage)?.removeItem(t)}async function ot(){return{localStorage:tt(ee(()=>localStorage)),sessionStorage:tt(ee(()=>sessionStorage)),cookies:Yt(),indexedDB:await Zt()}}function ee(e){try{return e()}catch{return null}}function tt(e){let t={};if(!e)return t;for(let n=0;n<e.length;n++){let r=e.key(n);r!=null&&(t[r]=e.getItem(r)??"")}return t}function Yt(){if(typeof document>"u"||!document.cookie)return[];let e=typeof location<"u"?location.hostname:"";return document.cookie.split("; ").filter(Boolean).map(t=>{let n=t.indexOf("="),r=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return{name:r,value:o,domain:e,path:"/"}})}async function Zt(){if(typeof indexedDB>"u"||typeof indexedDB.databases!="function")return[];try{let e=await indexedDB.databases(),t=[];for(let n of e)n.name&&t.push({name:n.name,stores:await en(n.name)});return t}catch{return[]}}function en(e){return new Promise(t=>{try{let n=indexedDB.open(e);n.onsuccess=()=>{let r=n.result,o=Array.from(r.objectStoreNames);r.close(),t(o)},n.onerror=()=>t([])}catch{t([])}})}var tn=40;function st(e){let t={longTasks:[]},n=[];if(typeof PerformanceObserver>"u")return{read:()=>({...t,navigation:it()}),stop:()=>{}};r("largest-contentful-paint",o=>{let c=o[o.length-1];if(!c)return;let i=c.element;t.lcp={valueMs:c.startTime,element:i?{nodeId:e.nodeIdFor(i),selector:Z(i),rect:rn(i)}:void 0}}),r("paint",o=>{for(let c of o)c.name==="first-contentful-paint"&&(t.fcp=c.startTime)}),r("layout-shift",o=>{let c=t.cls??0;for(let i of o)i.hadRecentInput||(c+=i.value);t.cls=c}),r("event",o=>{let c=t.inp??0;for(let i of o){let d=i.duration;d>c&&(c=d)}t.inp=c},{durationThreshold:40}),r("longtask",o=>{for(let c of o)t.longTasks.push({ts:e.now(),durationMs:c.duration});t.longTasks.length>200&&t.longTasks.splice(0,t.longTasks.length-200)});function r(o,c,i){try{let d=new PerformanceObserver(m=>c(m.getEntries()));d.observe({type:o,buffered:!0,...i??{}}),n.push(d)}catch{}}return{read:()=>{let o=it(),{resources:c,resourceSummary:i}=nn(o?.domInteractiveMs??t.fcp);return{...t,longTasks:t.longTasks.slice(),navigation:o,ttfb:t.ttfb??o?.ttfbMs,resources:c,resourceSummary:i}},stop:()=>n.forEach(o=>o.disconnect())}}function nn(e){if(typeof performance>"u"||!performance.getEntriesByType)return{};let t=performance.getEntriesByType("resource");if(!t.length)return{};let n=0,r=0;return{resources:t.map(i=>{n+=i.transferSize||0,r+=i.duration;let d=i.requestStart>0?Math.max(0,i.requestStart-i.startTime):void 0,m=e!=null&&i.responseEnd<=e&&(i.initiatorType==="link"||i.initiatorType==="css"||i.initiatorType==="script");return{name:i.name,initiatorType:i.initiatorType||"other",startMs:i.startTime,durationMs:i.duration,blockingMs:d,transferSizeBytes:i.transferSize||void 0,decodedSizeBytes:i.decodedBodySize||void 0,fromCache:i.transferSize===0&&i.decodedBodySize>0,renderBlocking:m}}).sort((i,d)=>d.durationMs-i.durationMs).slice(0,tn),resourceSummary:{count:t.length,transferBytes:n,durationMs:r}}}function it(){if(typeof performance>"u"||!performance.getEntriesByType)return;let e=performance.getEntriesByType("navigation")[0];if(e)return{ttfbMs:e.responseStart,domContentLoadedMs:e.domContentLoadedEventEnd,loadEventMs:e.loadEventEnd,domInteractiveMs:e.domInteractive,transferSizeBytes:e.transferSize}}function rn(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,w:t.width,h:t.height}}var ct=1e3;function L(){return typeof performance<"u"&&performance.now?performance.timeOrigin+performance.now():Date.now()}function on(e={}){let t=new J,n=new Y,r=l=>n.idFor(l),o=new F(ct),c=new F(ct),i=null,d,m=Le({buffer:o,registry:t,nodeIdFor:r,onEntry:l=>e.onConsole?.(l),now:L}),g=We({buffer:c,onEntry:l=>e.onNetwork?.(l),now:L}),a=st({nodeIdFor:r,now:L}),y=Ke({reg:n,onPicked:l=>e.onPicked?.(l),setPickedNode:l=>i=l});return{meta(){return{url:typeof location<"u"?location.href:"",title:typeof document<"u"?document.title:"",isUglyApp:typeof window<"u"&&"__uglyInspect"in window,viewport:{w:typeof window<"u"?window.innerWidth:0,h:typeof window<"u"?window.innerHeight:0,dpr:typeof window<"u"&&window.devicePixelRatio||1}}},consoleBuffer:l=>l==null?o.all():o.all().filter(h=>h.seq>l),networkBuffer:l=>{let v=[...c.all(),...Ve()].sort((E,M)=>E.ts-M.ts);return l==null?v:v.filter(E=>E.ts>l)},evaluate:(l,h)=>He(l,{registry:t,nodeIdFor:r,now:L,getPicked:()=>i,getLast:()=>d,setLast:v=>d=v},h),expand:l=>({entries:Me(t.get(l),{registry:t,nodeIdFor:r})}),domCapture:l=>$e(n,l,L),element:l=>Fe(n,l),highlight:l=>y.highlight(l),setPicker:l=>y.setEnabled(l),vitals:()=>a.read(),profile:l=>Ye(l,L),storage:()=>ot(),storageSet:(l,h,v)=>nt(l,h,v),storageRemove:(l,h)=>rt(l,h),reload:l=>{typeof location<"u"&&location.reload()},reset:()=>{t.clear(),n.clear(),o.clear(),c.clear(),i=null,d=void 0},stop:()=>{m(),g(),a.stop(),y.destroy()}}}function at(e){if(typeof window<"u"&&window.__uglyInspectAgent)return window.__uglyInspectAgent;let t=on(e);return typeof window<"u"&&(window.__uglyInspectAgent=t),t}var sn=new Set(["inspect.screenshot","inspect.openTarget"]);function ut(e,t,n){return{id:e,url:n.url,title:n.title,viewport:n.viewport,platform:t,isUglyApp:n.isUglyApp,open:!0}}async function lt(e,t,n={}){switch(t){case"inspect.eval":return e.evaluate(String(n.expression??""),{awaitPromise:n.awaitPromise,replMode:n.replMode});case"inspect.expand":return e.expand(String(n.objectId??""));case"inspect.console.buffer":return{entries:e.consoleBuffer(n.sinceSeq)};case"inspect.network.buffer":return{entries:e.networkBuffer(n.sinceTs)};case"inspect.dom.capture":return e.domCapture(n.maxDepth);case"inspect.element":return e.element({nodeId:n.nodeId,selector:n.selector});case"inspect.dom.highlight":e.highlight(n.nodeId??null);return;case"inspect.picker.set":e.setPicker(!!n.enabled);return;case"inspect.vitals":return e.vitals();case"inspect.profile":return e.profile(Number(n.durationMs??1e3));case"inspect.storage":return e.storage();case"inspect.storage.set":e.storageSet(n.area,String(n.key??""),String(n.value??""));return;case"inspect.storage.remove":e.storageRemove(n.area,String(n.key??""));return;case"inspect.network.reload":e.reload(!!n.ignoreCache);return;case"inspect.network.setCacheDisabled":case"inspect.setThrottle":return;default:throw sn.has(t)?new Error(`inspect: ${t} is host-serviced, not an agent method`):new Error(`inspect: unknown channel ${t}`)}}var q="self";function dt(e){let t=at({onConsole:n=>e.onEvent?.(`inspect.console:${q}`,n),onNetwork:n=>e.onEvent?.(`inspect.network:${q}`,n),onPicked:n=>e.onEvent?.(`inspect.picked:${q}`,n)});return{async dispatch(n,r={}){if(n==="inspect.listTargets")return{targets:[ut(q,e.platform,t.meta())]};if(n==="inspect.screenshot"){if(!e.screenshot)throw new Error("inspect.screenshot: no native capture on this shell");return e.screenshot({...r,targetId:q})}return lt(t,n,r)},stop(){t.stop()}}}function cn(e){return async()=>{let t=await e.invoke("capture.screenshot",void 0),n=typeof window<"u"?window.innerWidth:0,r=typeof window<"u"?window.innerHeight:0,o=typeof window<"u"&&window.devicePixelRatio||1;return{base64:t,width:n,height:r,dpr:o,format:"png"}}}function ft(e){let t=e.platform??e.native?.platform??"web",n=e.signer??(e.native?Ie(e.native):void 0),r=e.screenshot??(e.native?cn(e.native):void 0),o={},c=dt({platform:t,screenshot:r,onEvent:(i,d)=>o.host?.broadcast(i,d)});return o.host=Ce({socket:e.socket,signer:n,iceServers:e.iceServers,rtcFactory:e.rtcFactory,onInvoke:(i,d)=>c.dispatch(i,d??{})}),{stop(){o.host?.stop(),c.stop()},peerCount:()=>o.host?.peerCount()??0}}var U=window,N=U.__uglyInspectBootstrap;if(N&&U.UglyNative&&!U.__uglyInspectHostInstalled){U.__uglyInspectHostInstalled=!0;let e=U.UglyNative,t=Pe({requests:{},messages:{},url:N.wsUrl,getUrlParams:()=>({token:N.token,deviceId:N.deviceId,deviceLabel:N.deviceLabel??N.platform,inspectHost:"true",isHost:"true"})});t.connect(N.token).then(()=>ft({socket:t,native:e,platform:N.platform})).catch(()=>{})}})();
|
|
1
|
+
"use strict";(()=>{function Pe(e){let t=e.url??"/ws",n=t.startsWith("/")?typeof window<"u"?`${window.location.protocol==="https:"?"wss":"ws"}://${window.location.host}${t}`:`ws://localhost:${4321}${t}`:t,r=0;function o(){return String(++r)}let c=new Map,i=null,d=!1,m=!1,g=!1,a=0,y=!1,k=!1,l=e.initialFocus??!0,h=e.keepConnectedWhenUnfocused??!1,v=null,E=!1,M=0,x="connecting",te=1e3,pt=3e4,mt=5,me=1e3,ne=!1,gt=3e4,re=null,ge=null,yt=null,oe=null,_=null,ie=[],se=[],b=new Map,I=new Map,z=new Map;function ce(){re=new Promise((u,s)=>{ge=u,yt=s}),re.catch(()=>{})}ce();function W(u,s){x=u,typeof window<"u"&&window.dispatchEvent(new CustomEvent("ws-connection-state",{detail:{state:u,...s}}))}function wt(u){for(let{reject:s,timeout:f}of b.values())clearTimeout(f),s(new Error(u));b.clear(),I.clear(),z.clear()}function ae(u){for(let[s,f]of b)clearTimeout(f.timeout),f.retry?we(se,s):(b.delete(s),f.reject(new Error(u?"WebSocket disconnected (idle)":"WebSocket disconnected")))}function ye(u){i.send(JSON.stringify(u))}function we(u,s){u.length>=me&&(u.shift(),ne||(console.warn(`[socket] queue exceeded ${me} \u2014 dropping oldest message(s)`),ne=!0)),u.push(s)}function V(u){g&&d&&i?.readyState===WebSocket.OPEN?i.send(u):we(ie,u)}function ke(u,s,f=6e4,p=!0){if(typeof u=="object"&&u!==null){V(JSON.stringify(u));return}return new Promise((w,R)=>{let T=o(),P=JSON.stringify({type:u,id:T,data:s}),A=setTimeout(()=>{b.delete(T),R(new Error(`Request timeout: ${u}`))},f);b.set(T,{resolve:w,reject:R,timeout:A,serialized:P,retry:p,timeoutMs:f}),V(P)})}function he(u,s){V(JSON.stringify({type:u,data:s}))}function be(){B(),!(!l&&!h)&&(E=!1,v=setInterval(()=>{if(!(!d||!(l||h))){if(E){E=!1,kt();return}E=!0,he("ping",{})}},gt))}function B(){v&&(clearInterval(v),v=null)}function kt(){let u=i;if(M++,d=!1,m=!1,B(),u)try{u.removeEventListener("message",ve),u.close()}catch{}i=null,W("reconnecting",{attempt:a+1}),ae(!1),ce(),a++,X()}function ht(){for(let[u,s]of D)S(s.type,{...s.params,subId:u}).catch(f=>console.error("[resubscribe]",f))}let D=new Map;function bt(){for(;se.length>0&&i?.readyState===WebSocket.OPEN;){let u=se.shift(),s=b.get(u);s&&(i.send(s.serialized),s.timeoutMs!==null&&(s.timeout=setTimeout(()=>{b.delete(u),s.reject(new Error(`Timeout: retry ${u}`))},s.timeoutMs)))}}function vt(){for(;ie.length>0&&i?.readyState===WebSocket.OPEN;)i.send(ie.shift());bt(),e.buildId&&ke("buildId",{}).then(u=>{u!==e.buildId&&typeof window<"u"&&window.dispatchEvent(new CustomEvent("version-mismatch"))}).catch(()=>{}),y&&(ht(),y=!1)}function ue(u,s){typeof window<"u"&&window.dispatchEvent(new CustomEvent(u,{detail:s}))}function ve(u){E=!1;let s=JSON.parse(u.data,e.messageReviver);switch(s.type){case"pong":return;case"ready":g=!0,vt();return;case"authFailed":ue("auth-failed",{});return;case"track":s.subId&&I.get(s.subId)?.(s.data);return;case"frame":s.subId&&z.get(s.subId)?.(s.data);return;case"response":if(s.id){let f=b.get(s.id);f&&(clearTimeout(f.timeout),b.delete(s.id),f.resolve(s.data??s.result))}return;case"pushNotification":ue("push-notification-received",s.data);return;case"server-draining":ue("server-draining",s.data);return;default:{if(s.id&&s.type==="error"){let p=b.get(s.id);p&&(clearTimeout(p.timeout),b.delete(s.id),p.reject(new Error(s.error??"Unknown error")));return}if(s.id){let p=b.get(s.id);if(p){clearTimeout(p.timeout),b.delete(s.id),p.resolve(s.data??s.result);return}}e.onCustomMessage?.(s);let f=c.get(s.type);if(f)for(let p of f)p(s.data)}}}function S(u,s,f=6e4,p=!1){return new Promise((w,R)=>{let T=o(),P=JSON.stringify({id:T,type:u,payload:s}),A=f===null?null:setTimeout(()=>{b.delete(T),R(new Error(`Timeout: ${u}`))},f);b.set(T,{resolve:w,reject:R,timeout:A??setTimeout(()=>{},0),serialized:P,retry:p,timeoutMs:f}),V(P)})}function Se(u){if(u!==l)if(l=u,u)d?be():(a=0,X());else{if(h)return;B(),k=!0}}typeof document<"u"&&(l=document.visibilityState==="visible",document.addEventListener("visibilitychange",()=>{Se(document.visibilityState==="visible")}));function X(){if(m)return;m=!0,g=!1;let u=++M,s=new URL(n,typeof window<"u"?window.location.href:void 0);if(e.getUrlParams)for(let[f,p]of Object.entries(e.getUrlParams()))s.searchParams.set(f,p);i=new WebSocket(s.toString()),i.addEventListener("message",ve),i.addEventListener("open",()=>{m=!1;let f=a>0,p=k;if(d=!0,y=f||p,a=0,ne=!1,k=!1,W("connected",{wasReconnect:f,wasIdleReconnect:p}),ge?.(),l&&be(),oe){let w;_!==null&&b.has(_)?w=_:(w=o(),b.set(w,{resolve:()=>{},reject:()=>{},timeout:setTimeout(()=>b.delete(w),3e4),serialized:"",retry:!1,timeoutMs:3e4})),_=null,ye({id:w,type:"auth",payload:{token:oe}})}}),i.addEventListener("close",()=>{if(u!==M)return;if(m=!1,d=!1,B(),!l&&!h){k=!0,W("idle-disconnected"),ae(!0);return}W("reconnecting",{attempt:a+1}),ae(!1);let f=Math.min(pt,te*Math.pow(2,Math.min(a,mt)));ce(),setTimeout(()=>{a++,X()},f)}),i.addEventListener("error",()=>{})}return X(),{connect(u){oe=u;let s=o(),f=new Promise((p,w)=>{b.set(s,{resolve:R=>{let T=R;p({user:T.user,appToken:T.appToken})},reject:w,timeout:setTimeout(()=>{b.delete(s),w(new Error("Auth timeout"))},3e4),serialized:"",retry:!1,timeoutMs:3e4})});return i?.readyState===WebSocket.OPEN?ye({id:s,type:"auth",payload:{token:u}}):_=s,f},request(u,s,f){let p=f?.timeoutMs===void 0?6e4:f.timeoutMs;return S("request",{name:u,input:s},p,f?.retry??!0)},async requestStream(u,s,f,p){let w=await fetch(`/api/${u}`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},credentials:"include",body:JSON.stringify({input:s}),...p?.signal?{signal:p.signal}:{}});if(!w.ok||!w.body){let F=await w.json().catch(()=>({}));if(F.error)throw new Error(F.error);return F.result}let R=w.body.getReader(),T=new TextDecoder("utf-8"),P="",A,Ee=!1;for(;!Ee;){let{value:F,done:St}=await R.read();if(St)break;P+=T.decode(F,{stream:!0});let le;for(;(le=P.indexOf(`
|
|
2
|
+
`))!==-1;){let Te=P.slice(0,le).replace(/\r$/,"");if(P=P.slice(le+1),!Te.startsWith("data:"))continue;let Re=Te.slice(5).trimStart();if(!Re)continue;let j;try{j=JSON.parse(Re)}catch{continue}if(j.type==="__result__"){A=j.result,Ee=!0;break}if(j.type==="__error__")throw new Error(j.error??`request ${u} failed`);f(j)}}return A},getDoc(u,s){return S("request",{name:"storeGetDoc",input:{collection:u,id:s}}).then(f=>f.item)},getDocs(u,s,f){return S("request",{name:"storeGetDocs",input:{collection:u,filter:s,...f}}).then(p=>p.items)},getQuery(u,s,f){return S("request",{name:"storeGetQuery",input:{collection:u,query:s,...f}}).then(p=>p.items)},trackDoc(u,s,f){let p=o();return I.set(p,f),D.set(p,{type:"trackDoc",params:{collection:u,id:s}}),S("trackDoc",{collection:u,id:s,subId:p}).catch(w=>{console.error("[trackDoc]",w)}),()=>{I.delete(p),D.delete(p),S("unsubscribe",{subId:p}).catch(()=>{})}},trackDocs(u,s,f,p){let w=o();return I.set(w,f),p&&z.set(w,p),D.set(w,{type:"trackDocs",params:{collection:u,keys:s.keys,filter:s.filter,sort:s.sort,limit:s.limit,skip:s.skip}}),S("trackDocs",{collection:u,keys:s.keys,filter:s.filter,subId:w,sort:s.sort,limit:s.limit,skip:s.skip}).catch(R=>{console.error("[trackDocs]",R)}),()=>{I.delete(w),z.delete(w),D.delete(w),S("unsubscribe",{subId:w}).catch(()=>{})}},find(u,s,f){return S("request",{name:"storeGetDocs",input:{collection:u,filter:s,...f}}).then(p=>p.items)},trackQuery(u,s,f){let p=o();return I.set(p,f),D.set(p,{type:"trackQuery",params:{collection:u,keys:s.keys,filter:s.filter,sort:s.sort,limit:s.limit,skip:s.skip}}),S("trackQuery",{collection:u,keys:s.keys,filter:s.filter,subId:p,sort:s.sort,limit:s.limit,skip:s.skip}).catch(w=>{console.error("[trackQuery]",w)}),()=>{I.delete(p),D.delete(p),S("unsubscribe",{subId:p}).catch(()=>{})}},async uploadFile(u,s){let{uploadUrl:f,resultUrl:p}=await S("request",{name:"uploadUrl",input:{key:s,contentType:u.type}}),w=await fetch(f,{method:"PUT",body:u,headers:{"Content-Type":u.type}});if(!w.ok)throw new Error(`Upload failed: ${w.status} ${w.statusText}`);return p},emit:he,send:ke,on(u,s){let f=c.get(u);return f||(f=new Set,c.set(u,f)),f.add(s),()=>{f.delete(s),f.size===0&&c.delete(u)}},waitForConnection(u=3e4){return d?Promise.resolve():new Promise((s,f)=>{let p=setTimeout(()=>f(new Error("Connection timeout")),u);re?.then(()=>{clearTimeout(p),s()}).catch(w=>{clearTimeout(p),f(w instanceof Error?w:new Error(String(w)))})})},get connectionState(){return x},setFocused(u){Se(u)},disconnect(){wt("Disconnected"),B(),i?.close(),i=null}}}var dn=new TextEncoder;function K(e){let t=/a=fingerprint:(\S+)\s+([0-9A-Fa-f:]+)/.exec(e||"");return t?`${t[1].toLowerCase()} ${t[2].toUpperCase()}`:null}function xe(e){return e??{}}function Ce(e){let t=e.rtcFactory??(g=>new RTCPeerConnection(g)),n=new Map,r=new Set,o=[];async function c(g){let a=String(g.from??"");if(!a)return;let y=String(g.sdp??""),k=String(g.origin??"");if(e.signer&&!await e.signer.verify("client",K(y)??"",String(g.fpTag??""))){e.socket.emit("rtc:error",{to:a,reason:"fingerprint-auth-failed"});return}try{n.get(a)?.pc.close()}catch{}let l=t({iceServers:e.iceServers??[]}),h={pc:l,dc:null,origin:k};n.set(a,h),l.onicecandidate=x=>{x.candidate&&e.socket.emit("rtc:ice",{to:a,candidate:x.candidate.toJSON()})},l.ondatachannel=x=>{h.dc=x.channel,x.channel.onmessage=te=>{d(h,x.channel,te.data)}},await l.setRemoteDescription({type:"offer",sdp:y});let v=await l.createAnswer();await l.setLocalDescription(v);let E=l.localDescription?.sdp??v.sdp??"",M=e.signer?await e.signer.sign("host",K(E)??""):void 0;e.socket.emit("rtc:answer",{to:a,sdp:E,fpTag:M})}async function i(g){let a=n.get(String(g.from??""));if(a)try{await a.pc.addIceCandidate(g.candidate)}catch{}}async function d(g,a,y){let k;try{k=JSON.parse(typeof y=="string"?y:new TextDecoder().decode(y))}catch{return}if(k.t==="req"&&k.id!==void 0)try{let l=await e.onInvoke(String(k.channel),k.payload,g.origin);m(a,{t:"res",id:k.id,ok:!0,result:l})}catch(l){m(a,{t:"res",id:k.id,ok:!1,error:String(l?.message??l)})}else if(k.t==="sub"&&k.id!==void 0)r.add({dc:a,event:String(k.channel??""),id:k.id}),m(a,{t:"res",id:k.id,ok:!0,result:{snapshot:null}});else if(k.t==="unsub"&&k.id!==void 0)for(let l of[...r])l.dc===a&&l.id===k.id&&r.delete(l)}function m(g,a){try{g.readyState==="open"&&g.send(JSON.stringify(a))}catch{}}return o.push(e.socket.on("rtc:offer",g=>{c(xe(g))})),o.push(e.socket.on("rtc:ice",g=>{i(xe(g))})),{stop(){for(let g of o)try{g()}catch{}for(let g of n.values())try{g.pc.close()}catch{}n.clear(),r.clear()},broadcast(g,a){for(let y of r)y.event===g&&m(y.dc,{t:"evt",event:g,data:a})},peerCount:()=>n.size}}function Ie(e){return{sign:async(t,n)=>(await e.invoke("proxy.signFingerprint",{role:t,fingerprint:n})).tag,verify:async(t,n,r)=>(await e.invoke("proxy.verifyFingerprint",{role:t,fingerprint:n,tag:r})).ok}}var $=class{constructor(t){this.cap=t}cap;items=[];push(t){this.items.push(t),this.items.length>this.cap&&this.items.splice(0,this.items.length-this.cap)}since(t,n){let r=0,o=this.items.length;for(;r<o;){let c=r+o>>>1;n(this.items[c])<t?r=c+1:o=c}return this.items.slice(r)}all(){return this.items.slice()}clear(){this.items=[]}size(){return this.items.length}};var J=class{seq=0;byId=new Map;put(t){let n=`o${++this.seq}`;return this.byId.set(n,t),n}get(t){return this.byId.get(t)}clear(){this.byId.clear()}};function Tt(e){return typeof Node<"u"&&typeof e=="object"&&e!==null&&e instanceof Node}function H(e,t){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ne(e){return Object.getPrototypeOf(e)?.constructor?.name}function C(e,t){switch(typeof e){case"undefined":return{type:"undefined"};case"boolean":return{type:"boolean",value:e};case"bigint":return{type:"bigint",value:`${e}n`,preview:`${e}n`};case"symbol":return{type:"symbol",value:String(e),preview:String(e)};case"string":return{type:"string",value:H(e,1e3)};case"number":return Number.isFinite(e)?{type:"number",value:e}:{type:"number",value:String(e),preview:String(e)};case"function":return{type:"function",className:"Function",preview:`\u0192 ${e.name||"(anonymous)"}()`};case"object":break;default:return{type:"object",preview:String(e)}}if(e===null)return{type:"null"};let n=e;if(Tt(e))return{type:"node",className:e.nodeName??"Node",preview:xt(e),nodeId:t.nodeIdFor?.(e)};if(e instanceof Date)return{type:"date",className:"Date",preview:It(e)};if(e instanceof RegExp)return{type:"regexp",className:"RegExp",preview:String(e)};if(e instanceof Error)return{type:"error",className:e.name||"Error",preview:H(`${e.name}: ${e.message}`,100),objectId:t.registry.put(e)};if(Ct(e))return{type:"promise",className:"Promise",preview:"Promise",objectId:t.registry.put(e)};if(e instanceof Map)return{type:"map",className:"Map",size:e.size,objectId:t.registry.put(e),preview:`Map(${e.size})`,entries:Oe(e,t)};if(e instanceof Set)return{type:"set",className:"Set",size:e.size,objectId:t.registry.put(e),preview:`Set(${e.size})`,entries:Ae(e,t)};if(Array.isArray(e))return{type:"array",className:"Array",size:e.length,objectId:t.registry.put(e),preview:`Array(${e.length})`,entries:De(e,t)};let r=Object.keys(n);return{type:"object",className:Ne(n)??"Object",size:r.length,objectId:t.registry.put(n),preview:Rt(n,r),entries:de(n,r,t)}}function Me(e,t){if(e instanceof Map)return Oe(e,t,1/0).map(n=>n.value);if(e instanceof Set)return Ae(e,t,1/0).map(n=>n.value);if(Array.isArray(e))return De(e,t,1/0).map(n=>n.value);if(e instanceof Error)return de({name:e.name,message:e.message,stack:e.stack},["name","message","stack"],t,1/0).map(n=>n.value);if(typeof e=="object"&&e!==null){let n=Object.keys(e);return de(e,n,t,1/0).map(r=>r.value)}return[]}function De(e,t,n=5){let r=[];for(let o=0;o<e.length&&o<n;o++)r.push({key:String(o),value:C(e[o],t)});return r}function de(e,t,n,r=5){let o=[];for(let c=0;c<t.length&&c<r;c++){let i=t[c],d;try{d=e[i]}catch{d="(getter threw)"}o.push({key:i,value:C(d,n)})}return o}function Oe(e,t,n=5){let r=[],o=0;for(let[c,i]of e){if(o++>=n)break;r.push({key:C(c,t),value:C(i,t)})}return r}function Ae(e,t,n=5){let r=[],o=0;for(let c of e){if(o++>=n)break;r.push({value:C(c,t)})}return r}function Rt(e,t){let n=t.slice(0,5).map(o=>{let c;try{c=e[o]}catch{c="\u2026"}return`${o}: ${Pt(c)}`}),r=t.length>5?", \u2026":"";return H(`{${n.join(", ")}${r}}`,100)}function Pt(e){let t=typeof e;return t==="string"?`"${H(e,20)}"`:t==="object"&&e!==null?Array.isArray(e)?`Array(${e.length})`:Ne(e)??"Object":String(e)}function xt(e){let t=e;if(t.nodeType===1){let n=(t.nodeName??"").toLowerCase(),r=t.id?`#${t.id}`:"",o=typeof t.className=="string"&&t.className?`.${t.className.trim().split(/\s+/).join(".")}`:"";return H(`<${n}${r}${o}>`,100)}return t.nodeName??"Node"}function Ct(e){return typeof e?.then=="function"}function It(e){try{return e.toISOString()}catch{return"Invalid Date"}}var je=["log","info","warn","error","debug"];function Le(e){if(typeof console>"u")return()=>{};let t=0,n={};for(let i of je){let d=console[i];typeof d=="function"&&(n[i]=d,console[i]=(...m)=>{try{c(i,m)}catch{}d.apply(console,m)})}let r=i=>{c("error",[i.message],{stack:O(i.error?.stack),source:{url:i.filename||"",line:i.lineno||0,col:i.colno||0}})},o=i=>{let d=i.reason;c("error",[`Unhandled rejection: ${d?.message??String(i.reason)}`],{stack:O(d?.stack)})};typeof window<"u"&&(window.addEventListener("error",r),window.addEventListener("unhandledrejection",o));function c(i,d,m){let g=d.map(k=>C(k,{registry:e.registry,nodeIdFor:e.nodeIdFor})),a=m?.stack??O(new Error().stack,1),y={seq:++t,ts:e.now(),level:i,args:g,text:Nt(d),stack:a.length?a:void 0,source:m?.source??a[0]?{url:a[0].url,line:a[0].line,col:a[0].col}:void 0};e.buffer.push(y),e.onEntry?.(y)}return()=>{for(let i of je){let d=n[i];d&&(console[i]=d)}typeof window<"u"&&(window.removeEventListener("error",r),window.removeEventListener("unhandledrejection",o))}}function Nt(e){return e.map(t=>{if(typeof t=="string")return t;if(t instanceof Error)return`${t.name}: ${t.message}`;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ").slice(0,2e3)}function O(e,t=0){if(!e)return[];let n=[],r=e.split(`
|
|
3
|
+
`);for(let o of r){let c=o.trim(),i=/^at\s+(.*?)\s+\((.*?):(\d+):(\d+)\)$/.exec(c)||/^at\s+(.*?):(\d+):(\d+)$/.exec(c);if(i){i.length===5?n.push({functionName:i[1],url:i[2],line:+i[3],col:+i[4]}):n.push({functionName:"(anonymous)",url:i[1],line:+i[2],col:+i[3]});continue}i=/^(.*?)@(.*?):(\d+):(\d+)$/.exec(c),i&&n.push({functionName:i[1]||"(anonymous)",url:i[2],line:+i[3],col:+i[4]})}return n.slice(t)}function Fe(e,t,n=Date.now){let r=t!=null&&t>0?t:40,o=typeof document<"u"&&document.documentElement?fe(document.documentElement,e,r,0):At();return{documentUrl:typeof location<"u"?location.href:"",capturedAt:n(),root:o}}function fe(e,t,n,r){let o={nodeId:t.idFor(e),nodeType:e.nodeType,nodeName:e.nodeName};if(e.nodeType===Node.TEXT_NODE||e.nodeType===Node.COMMENT_NODE){let a=(e.textContent??"").trim();return a&&(o.textContent=a.slice(0,200)),o}if(e.nodeType!==Node.ELEMENT_NODE)return o;let c=e;if(o.attributes=Dt(c),o.rect=Ot(c),r>=n)return o;let i=c.shadowRoot;i&&(o.shadowRoots=Array.from(i.childNodes).filter(Be).map(a=>fe(a,t,n,r+1)));let d=[],m=_e(c,"before");m&&d.push(m);for(let a of Array.from(c.childNodes))Be(a)&&d.push(fe(a,t,n,r+1));let g=_e(c,"after");return g&&d.push(g),d.length&&(o.children=d),o}function _e(e,t){if(typeof getComputedStyle>"u")return;let n;try{n=getComputedStyle(e,`::${t}`).content}catch{return}if(!(!n||n==="none"||n==="normal"))return{nodeId:`${Mt(e)}::${t}`,nodeType:1,nodeName:`::${t}`,pseudo:t,textContent:n}}function Mt(e){return e.__inspectPseudoBase??e.tagName}function Be(e){return e.nodeType===Node.TEXT_NODE?!!(e.textContent??"").trim():e.nodeType===Node.ELEMENT_NODE||e.nodeType===Node.COMMENT_NODE}function Dt(e){let t={};for(let n of Array.from(e.attributes))t[n.name]=n.value;return t}function Ot(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,w:t.width,h:t.height}}function At(){return{nodeId:"n0",nodeType:9,nodeName:"#document"}}function $e(e,t){let n=jt(e,t);if(!n)throw new Error(`inspect.element: node not found (${t.nodeId??t.selector??"?"})`);let r=getComputedStyle(n),o=Ut(n);return{nodeId:e.idFor(n),tag:n.tagName.toLowerCase(),attributes:qt(n),computedStyles:Lt(r),matchedRules:_t(n),boxModel:Ft(n,r,o),eventListeners:$t(n),accessibility:Ht(n),rect:o}}function jt(e,t){if(t.nodeId){let n=e.get(t.nodeId);return n?.nodeType===1?n:null}return t.selector&&typeof document<"u"?document.querySelector(t.selector):null}function Lt(e){let t={};for(let n=0;n<e.length;n++){let r=e.item(n);t[r]=e.getPropertyValue(r)}return t}function _t(e){let t=[];if(typeof document>"u")return t;for(let n of Array.from(document.styleSheets)){let r;try{r=n.cssRules}catch{continue}let o=n.href??void 0;for(let c of Array.from(r)){if(!(c instanceof CSSStyleRule))continue;let i=!1;try{i=e.matches(c.selectorText)}catch{i=!1}i&&t.push({selector:c.selectorText,source:o?{url:o,line:0,col:0}:void 0,props:Bt(c.style)})}}return t}function Bt(e){let t={};for(let n=0;n<e.length;n++){let r=e.item(n);t[r]=e.getPropertyValue(r)}return t}function Ft(e,t,n){let r=(o,c)=>({top:Q(t.getPropertyValue(`${o}-top${c}`)),right:Q(t.getPropertyValue(`${o}-right${c}`)),bottom:Q(t.getPropertyValue(`${o}-bottom${c}`)),left:Q(t.getPropertyValue(`${o}-left${c}`))});return{content:n,padding:r("padding",""),border:r("border","-width"),margin:r("margin","")}}function $t(e){let n=(typeof window<"u"?window:{}).__inspectGetEventListeners;if(!n)return[];try{let r=n(e),o=[];for(let[c,i]of Object.entries(r))for(let d of i)o.push({type:c,useCapture:d.useCapture,passive:d.passive});return o}catch{return[]}}function Ht(e){let t={};for(let o of Array.from(e.attributes))o.name.startsWith("aria-")&&(t[o.name]=o.value);let n=e.getAttribute("role")??void 0,r=e.getAttribute("aria-label")??e.title??(e.textContent??"").trim().slice(0,80)??void 0;return{role:n,name:r||void 0,properties:t}}function qt(e){let t={};for(let n of Array.from(e.attributes))t[n.name]=n.value;return t}function Ut(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,w:t.width,h:t.height}}function Q(e){let t=parseFloat(e);return Number.isFinite(t)?t:0}async function He(e,t,n){let r=t.now();try{let o=zt(e,n?.replMode?{$0:t.getPicked(),$_:t.getLast()}:{});return n?.awaitPromise&&Wt(o)&&(o=await o),t.setLast(o),{ok:!0,value:C(o,{registry:t.registry,nodeIdFor:t.nodeIdFor}),tookMs:t.now()-r}}catch(o){let c=o;return{ok:!1,exception:{text:`${c?.name??"Error"}: ${c?.message??String(o)}`,stack:O(c?.stack)},tookMs:t.now()-r}}}function zt(e,t){let n=Object.keys(t);if(n.length===0)return(0,eval)(e);let r=new Function(...n,`return (${e});`);try{return r(...n.map(o=>t[o]))}catch(o){if(o instanceof SyntaxError)return new Function(...n,e)(...n.map(i=>t[i]));throw o}}function Wt(e){return typeof e?.then=="function"}var G=64*1024;function We(e){if(typeof window>"u")return()=>{};let t=0,n=()=>`r${++t}`,r=window.fetch?.bind(window);r&&(window.fetch=async(m,g)=>{let a=e.now(),y=(g?.method||(m instanceof Request?m.method:"GET")).toUpperCase(),k=m instanceof Request?m.url:String(m),l={id:n(),ts:a,method:y,url:k,resourceType:"fetch",requestHeaders:Ue(g?.headers??(m instanceof Request?m.headers:void 0)),requestBody:ze(g?.body),timing:{startMs:a,durationMs:0}};try{let h=await r(m,g);return l.status=h.status,l.responseHeaders=Ue(h.headers),l.timing.durationMs=e.now()-a,l.fromCache=h.fromCache,await Kt(h,l),d(l),h}catch(h){throw l.failed=!0,l.timing.durationMs=e.now()-a,l.responseBody={kind:"text",data:String(h?.message??h)},d(l),h}});let o=window.XMLHttpRequest,c=o?.prototype.open,i=o?.prototype.send;o&&c&&i&&(o.prototype.open=function(g,a,...y){return this.__inspect={method:g.toUpperCase(),url:a,start:0},c.apply(this,[g,a,...y])},o.prototype.send=function(g){let a=this.__inspect;return a&&(a.start=e.now(),this.addEventListener("loadend",()=>{let y={id:n(),ts:a.start,method:a.method,url:a.url,status:this.status,resourceType:"xhr",requestHeaders:{},responseHeaders:Xt(this.getAllResponseHeaders()),requestBody:ze(g),responseBody:Jt(this),timing:{startMs:a.start,durationMs:e.now()-a.start},failed:this.status===0};d(y)})),i.apply(this,[g])});function d(m){e.buffer.push(m),e.onEntry?.(m)}return()=>{r&&(window.fetch=r),o&&c&&(o.prototype.open=c),o&&i&&(o.prototype.send=i)}}function qe(e){return e.responseStatus||void 0}function Ve(){if(typeof performance>"u"||!performance.getEntriesByType)return[];let e=performance.timeOrigin??0,t=[],n=performance.getEntriesByType("navigation")[0];n&&t.push({id:"nav",ts:e+n.startTime,method:"GET",url:n.name||(typeof location<"u"?location.href:""),status:qe(n),resourceType:"document",requestHeaders:{},timing:{startMs:e+n.startTime,durationMs:n.duration,ttfbMs:n.responseStart-n.startTime},sizeBytes:n.transferSize||void 0});for(let r of performance.getEntriesByType("resource"))r.initiatorType==="fetch"||r.initiatorType==="xmlhttprequest"||t.push({id:`res:${Math.round(r.startTime)}:${r.name}`,ts:e+r.startTime,method:"GET",url:r.name,status:qe(r),resourceType:Vt(r.initiatorType),requestHeaders:{},timing:{startMs:e+r.startTime,durationMs:r.duration},sizeBytes:r.transferSize||r.decodedBodySize||void 0,fromCache:r.transferSize===0&&r.decodedBodySize>0});return t}function Vt(e){switch(e){case"img":case"image":return"img";case"css":case"link":return"css";case"script":return"script";case"font":return"font";default:return e||"other"}}function Ue(e){let t={};if(!e)return t;if(typeof Headers<"u"&&e instanceof Headers)e.forEach((n,r)=>t[r]=n);else if(Array.isArray(e))for(let[n,r]of e)t[n]=r;else Object.assign(t,e);return t}function Xt(e){let t={};for(let n of e.split(`\r
|
|
4
|
+
`)){let r=n.indexOf(":");r>0&&(t[n.slice(0,r).trim().toLowerCase()]=n.slice(r+1).trim())}return t}function ze(e){if(e!=null)return typeof e=="string"?e.slice(0,G):typeof URLSearchParams<"u"&&e instanceof URLSearchParams?e.toString().slice(0,G):"(binary)"}async function Kt(e,t){let n=e.headers.get("content-type")||"";if(!/json|text|javascript|xml|html|csv/i.test(n)){t.responseBody={kind:"omitted"};return}try{let r=await e.clone().text();t.sizeBytes=r.length;let o=/json/i.test(n)?"json":"text";t.responseBody={kind:o,data:r.slice(0,G)}}catch{t.responseBody={kind:"omitted"}}}function Jt(e){try{if(e.responseType===""||e.responseType==="text"){let t=e.responseText||"",n=e.getResponseHeader("content-type")||"";return{kind:/json/i.test(n)?"json":"text",data:t.slice(0,G)}}}catch{}return{kind:"omitted"}}var Y=class{seq=0;byId=new Map;idOf=new WeakMap;idFor(t){let n=this.idOf.get(t);if(n)return this.byId.set(n,t),n;let r=`n${++this.seq}`;return this.idOf.set(t,r),this.byId.set(r,t),r}get(t){return this.byId.get(t)}clear(){this.byId.clear()}};function Z(e){let t=e.getAttribute?.("data-id");if(t)return`[data-id=${t}]`;let n=e.getAttribute?.("role"),r=e.tagName.toLowerCase();return e.id?`${r}#${e.id}`:n?`${r}[role=${n}]`:r}var Xe="__ugly_inspect_overlay__";function Ke(e){if(typeof document>"u")return{setEnabled:()=>{},highlight:()=>{},destroy:()=>{}};let t=!1,n=null;function r(){if(n)return n;let a=document.createElement("div");return a.id=Xe,Object.assign(a.style,{position:"fixed",pointerEvents:"none",zIndex:"2147483647",background:"rgba(64,128,255,0.28)",border:"1px solid rgba(64,128,255,0.9)",boxSizing:"border-box",top:"0",left:"0",display:"none"}),document.documentElement.appendChild(a),n=a,a}function o(a){let y=r();if(!a){y.style.display="none";return}Object.assign(y.style,{display:"block",transform:`translate(${a.x}px, ${a.y}px)`,width:`${a.w}px`,height:`${a.h}px`})}let c=a=>{let y=d(a.clientX,a.clientY);y&&o(pe(y))},i=a=>{let y=d(a.clientX,a.clientY);y&&(a.preventDefault(),a.stopPropagation(),e.setPickedNode(y),e.onPicked({nodeId:e.reg.idFor(y),selector:Z(y),rect:pe(y)}),m(!1))};function d(a,y){n&&(n.style.display="none");let k=document.elementFromPoint(a,y);return k&&k.id!==Xe?k:null}function m(a){a!==t&&(t=a,a?(window.addEventListener("pointermove",c,!0),window.addEventListener("pointerdown",i,!0)):(window.removeEventListener("pointermove",c,!0),window.removeEventListener("pointerdown",i,!0),o(null)))}function g(a){if(!a){o(null);return}let y=e.reg.get(a);y?.nodeType===1&&o(pe(y))}return{setEnabled:m,highlight:g,destroy:()=>{m(!1),n?.remove(),n=null}}}function pe(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,w:t.width,h:t.height}}var Ge=4;async function Ye(e,t){let n=t(),r=[];await new Promise(c=>{let i=()=>{r.push(Qt()),t()-n>=e?c():Je(i)};Je(i)});let o=t();return{startTime:n,endTime:o,durationMs:o-n,sampleCount:r.length,precise:!1,root:Gt(r)}}function Je(e){typeof setTimeout<"u"?setTimeout(e,Ge):e()}function Qt(){return O(new Error().stack,1).filter(t=>!/profile\.(js|ts)/.test(t.url)).map(t=>({url:t.url,line:t.line,col:t.col,functionName:t.functionName})).reverse()}function Gt(e){let t=0,n=Qe(t++,"(root)");for(let r of e){let o=n;o.hitCount++;for(let c of r){let i=c,d=`${i.functionName??"(anonymous)"}@${i.url}:${i.line}`,m=o.childMap.get(d);m||(m=Qe(t++,i.functionName??"(anonymous)",{url:i.url,line:i.line,col:i.col}),o.childMap.set(d,m),o.children.push(m)),m.hitCount++,o=m}}return Ze(n,e.length),et(n)}function Qe(e,t,n){return{id:e,functionName:t,source:n,selfTimeMs:0,totalTimeMs:0,hitCount:0,children:[],childMap:new Map}}function Ze(e,t){let n=0;for(let r of e.children)n+=Ze(r,t);return e.totalTimeMs=e.hitCount*Ge,e.selfTimeMs=Math.max(0,e.totalTimeMs-n),e.totalTimeMs}function et(e){return{id:e.id,functionName:e.functionName,source:e.source,selfTimeMs:e.selfTimeMs,totalTimeMs:e.totalTimeMs,hitCount:e.hitCount,children:e.children.map(t=>et(t))}}function nt(e,t,n){if(e==="cookie"){document.cookie=`${encodeURIComponent(t)}=${encodeURIComponent(n)}; path=/`;return}ee(()=>e==="session"?sessionStorage:localStorage)?.setItem(t,n)}function rt(e,t){if(e==="cookie"){document.cookie=`${encodeURIComponent(t)}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`;return}ee(()=>e==="session"?sessionStorage:localStorage)?.removeItem(t)}async function ot(){return{localStorage:tt(ee(()=>localStorage)),sessionStorage:tt(ee(()=>sessionStorage)),cookies:Yt(),indexedDB:await Zt()}}function ee(e){try{return e()}catch{return null}}function tt(e){let t={};if(!e)return t;for(let n=0;n<e.length;n++){let r=e.key(n);r!=null&&(t[r]=e.getItem(r)??"")}return t}function Yt(){if(typeof document>"u"||!document.cookie)return[];let e=typeof location<"u"?location.hostname:"";return document.cookie.split("; ").filter(Boolean).map(t=>{let n=t.indexOf("="),r=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return{name:r,value:o,domain:e,path:"/"}})}async function Zt(){if(typeof indexedDB>"u"||typeof indexedDB.databases!="function")return[];try{let e=await indexedDB.databases(),t=[];for(let n of e)n.name&&t.push({name:n.name,stores:await en(n.name)});return t}catch{return[]}}function en(e){return new Promise(t=>{try{let n=indexedDB.open(e);n.onsuccess=()=>{let r=n.result,o=Array.from(r.objectStoreNames);r.close(),t(o)},n.onerror=()=>t([])}catch{t([])}})}var tn=40;function st(e){let t={longTasks:[]},n=[];if(typeof PerformanceObserver>"u")return{read:()=>({...t,navigation:it()}),stop:()=>{}};r("largest-contentful-paint",o=>{let c=o[o.length-1];if(!c)return;let i=c.element;t.lcp={valueMs:c.startTime,element:i?{nodeId:e.nodeIdFor(i),selector:Z(i),rect:rn(i)}:void 0}}),r("paint",o=>{for(let c of o)c.name==="first-contentful-paint"&&(t.fcp=c.startTime)}),r("layout-shift",o=>{let c=t.cls??0;for(let i of o)i.hadRecentInput||(c+=i.value);t.cls=c}),r("event",o=>{let c=t.inp??0;for(let i of o){let d=i.duration;d>c&&(c=d)}t.inp=c},{durationThreshold:40}),r("longtask",o=>{for(let c of o)t.longTasks.push({ts:e.now(),durationMs:c.duration});t.longTasks.length>200&&t.longTasks.splice(0,t.longTasks.length-200)});function r(o,c,i){try{let d=new PerformanceObserver(m=>c(m.getEntries()));d.observe({type:o,buffered:!0,...i??{}}),n.push(d)}catch{}}return{read:()=>{let o=it(),{resources:c,resourceSummary:i}=nn(o?.domInteractiveMs??t.fcp);return{...t,longTasks:t.longTasks.slice(),navigation:o,ttfb:t.ttfb??o?.ttfbMs,resources:c,resourceSummary:i}},stop:()=>n.forEach(o=>o.disconnect())}}function nn(e){if(typeof performance>"u"||!performance.getEntriesByType)return{};let t=performance.getEntriesByType("resource");if(!t.length)return{};let n=0,r=0;return{resources:t.map(i=>{n+=i.transferSize||0,r+=i.duration;let d=i.requestStart>0?Math.max(0,i.requestStart-i.startTime):void 0,m=e!=null&&i.responseEnd<=e&&(i.initiatorType==="link"||i.initiatorType==="css"||i.initiatorType==="script");return{name:i.name,initiatorType:i.initiatorType||"other",startMs:i.startTime,durationMs:i.duration,blockingMs:d,transferSizeBytes:i.transferSize||void 0,decodedSizeBytes:i.decodedBodySize||void 0,fromCache:i.transferSize===0&&i.decodedBodySize>0,renderBlocking:m}}).sort((i,d)=>d.durationMs-i.durationMs).slice(0,tn),resourceSummary:{count:t.length,transferBytes:n,durationMs:r}}}function it(){if(typeof performance>"u"||!performance.getEntriesByType)return;let e=performance.getEntriesByType("navigation")[0];if(e)return{ttfbMs:e.responseStart,domContentLoadedMs:e.domContentLoadedEventEnd,loadEventMs:e.loadEventEnd,domInteractiveMs:e.domInteractive,transferSizeBytes:e.transferSize}}function rn(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,w:t.width,h:t.height}}var ct=1e3;function L(){return typeof performance<"u"&&performance.now?performance.timeOrigin+performance.now():Date.now()}function on(e={}){let t=new J,n=new Y,r=l=>n.idFor(l),o=new $(ct),c=new $(ct),i=null,d,m=Le({buffer:o,registry:t,nodeIdFor:r,onEntry:l=>e.onConsole?.(l),now:L}),g=We({buffer:c,onEntry:l=>e.onNetwork?.(l),now:L}),a=st({nodeIdFor:r,now:L}),y=Ke({reg:n,onPicked:l=>e.onPicked?.(l),setPickedNode:l=>i=l});return{meta(){return{url:typeof location<"u"?location.href:"",title:typeof document<"u"?document.title:"",isUglyApp:typeof window<"u"&&"__uglyInspect"in window,viewport:{w:typeof window<"u"?window.innerWidth:0,h:typeof window<"u"?window.innerHeight:0,dpr:typeof window<"u"&&window.devicePixelRatio||1}}},consoleBuffer:l=>l==null?o.all():o.all().filter(h=>h.seq>l),networkBuffer:l=>{let v=[...c.all(),...Ve()].sort((E,M)=>E.ts-M.ts);return l==null?v:v.filter(E=>E.ts>l)},evaluate:(l,h)=>He(l,{registry:t,nodeIdFor:r,now:L,getPicked:()=>i,getLast:()=>d,setLast:v=>d=v},h),expand:l=>({entries:Me(t.get(l),{registry:t,nodeIdFor:r})}),domCapture:l=>Fe(n,l,L),element:l=>$e(n,l),highlight:l=>y.highlight(l),setPicker:l=>y.setEnabled(l),vitals:()=>a.read(),profile:l=>Ye(l,L),storage:()=>ot(),storageSet:(l,h,v)=>nt(l,h,v),storageRemove:(l,h)=>rt(l,h),reload:l=>{typeof location<"u"&&location.reload()},reset:()=>{t.clear(),n.clear(),o.clear(),c.clear(),i=null,d=void 0},stop:()=>{m(),g(),a.stop(),y.destroy()}}}function at(e){if(typeof window<"u"&&window.__uglyInspectAgent)return window.__uglyInspectAgent;let t=on(e);return typeof window<"u"&&(window.__uglyInspectAgent=t),t}var sn=new Set(["inspect.screenshot","inspect.openTarget"]);function ut(e,t,n){return{id:e,url:n.url,title:n.title,viewport:n.viewport,platform:t,isUglyApp:n.isUglyApp,open:!0}}async function lt(e,t,n={}){switch(t){case"inspect.eval":return e.evaluate(String(n.expression??""),{awaitPromise:n.awaitPromise,replMode:n.replMode});case"inspect.expand":return e.expand(String(n.objectId??""));case"inspect.console.buffer":return{entries:e.consoleBuffer(n.sinceSeq)};case"inspect.network.buffer":return{entries:e.networkBuffer(n.sinceTs)};case"inspect.dom.capture":return e.domCapture(n.maxDepth);case"inspect.element":return e.element({nodeId:n.nodeId,selector:n.selector});case"inspect.dom.highlight":e.highlight(n.nodeId??null);return;case"inspect.picker.set":e.setPicker(!!n.enabled);return;case"inspect.vitals":return e.vitals();case"inspect.profile":return e.profile(Number(n.durationMs??1e3));case"inspect.storage":return e.storage();case"inspect.storage.set":e.storageSet(n.area,String(n.key??""),String(n.value??""));return;case"inspect.storage.remove":e.storageRemove(n.area,String(n.key??""));return;case"inspect.network.reload":e.reload(!!n.ignoreCache);return;case"inspect.network.setCacheDisabled":case"inspect.setThrottle":return;default:throw sn.has(t)?new Error(`inspect: ${t} is host-serviced, not an agent method`):new Error(`inspect: unknown channel ${t}`)}}var q="self";function dt(e){let t=at({onConsole:n=>e.onEvent?.(`inspect.console:${q}`,n),onNetwork:n=>e.onEvent?.(`inspect.network:${q}`,n),onPicked:n=>e.onEvent?.(`inspect.picked:${q}`,n)});return{async dispatch(n,r={}){if(n==="inspect.listTargets")return{targets:[ut(q,e.platform,t.meta())]};if(n==="inspect.screenshot"){if(!e.screenshot)throw new Error("inspect.screenshot: no native capture on this shell");return e.screenshot({...r,targetId:q})}return lt(t,n,r)},stop(){t.stop()}}}function cn(e){return async()=>{let t=await e.invoke("capture.screenshot",void 0),n=typeof window<"u"?window.innerWidth:0,r=typeof window<"u"?window.innerHeight:0,o=typeof window<"u"&&window.devicePixelRatio||1;return{base64:t,width:n,height:r,dpr:o,format:"png"}}}function ft(e){let t=e.platform??e.native?.platform??"web",n=e.signer??(e.native?Ie(e.native):void 0),r=e.screenshot??(e.native?cn(e.native):void 0),o={},c=dt({platform:t,screenshot:r,onEvent:(i,d)=>o.host?.broadcast(i,d)});return o.host=Ce({socket:e.socket,signer:n,iceServers:e.iceServers,rtcFactory:e.rtcFactory,onInvoke:(i,d)=>c.dispatch(i,d??{})}),{stop(){o.host?.stop(),c.stop()},peerCount:()=>o.host?.peerCount()??0}}var U=window,N=U.__uglyInspectBootstrap;if(N&&U.UglyNative&&!U.__uglyInspectHostInstalled){U.__uglyInspectHostInstalled=!0;let e=U.UglyNative,t=Pe({requests:{},messages:{},url:N.wsUrl,getUrlParams:()=>({token:N.token,deviceId:N.deviceId,deviceLabel:N.deviceLabel??N.platform,inspectHost:"true",isHost:"true"})});t.connect(N.token).then(()=>ft({socket:t,native:e,platform:N.platform})).catch(()=>{})}})();
|
|
@@ -11,6 +11,21 @@ export interface BrowserTab {
|
|
|
11
11
|
* protocol (invoke for actions, subscribe for the tab set). Desktop implements
|
|
12
12
|
* it; other hosts reject. No UglyDesktop bridge.
|
|
13
13
|
*/
|
|
14
|
+
/** Open/focus a dock app (or a plain URL/search) in the Ugly Studio browser. */
|
|
15
|
+
export interface BrowserOpenOpts {
|
|
16
|
+
url: string;
|
|
17
|
+
/** Close the CALLING tab after opening (only if it is the `/home` launcher).
|
|
18
|
+
* The `/home` page sets this so its own search / open-app action replaces the
|
|
19
|
+
* /home tab — the single thing that removes /home. A plain tab/dock switch
|
|
20
|
+
* never closes /home. */
|
|
21
|
+
closeCurrent?: boolean;
|
|
22
|
+
/** Stable dock-app id — a project id (dedups) or a nanoid (generic site/search). */
|
|
23
|
+
appId?: string;
|
|
24
|
+
title?: string;
|
|
25
|
+
icon?: string;
|
|
26
|
+
/** Dock-app kind — the opener declares it (no host-based guessing). */
|
|
27
|
+
kind?: 'app' | 'pwa' | 'web';
|
|
28
|
+
}
|
|
14
29
|
export interface BrowserFacade {
|
|
15
30
|
newTab(url: string): Promise<number>;
|
|
16
31
|
navigate(id: number, url: string): Promise<void>;
|
|
@@ -19,6 +34,10 @@ export interface BrowserFacade {
|
|
|
19
34
|
back(id: number): Promise<void>;
|
|
20
35
|
list(): Promise<BrowserTab[]>;
|
|
21
36
|
onTabs(cb: (tabs: BrowserTab[]) => void): () => void;
|
|
37
|
+
/** Open/focus a dock app slot for `opts.url`. Dispatches the existing
|
|
38
|
+
* `browser.openApp` channel (iOS/Android/desktop all handle it), mapping
|
|
39
|
+
* `closeCurrent` → the shells' `closeCaller`. */
|
|
40
|
+
open(opts: BrowserOpenOpts): Promise<void>;
|
|
22
41
|
}
|
|
23
42
|
type Invoke = (channel: string, payload: unknown) => Promise<unknown>;
|
|
24
43
|
type Subscribe = (event: string, cb: (data: unknown) => void) => () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/native/facades/browser.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/native/facades/browser.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ;;;8BAG0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACrD;;sDAEkD;IAClD,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AACtE,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;AAE5E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,aAAa,CAavF"}
|
|
@@ -8,6 +8,7 @@ export function createBrowserFacade(invoke, subscribe) {
|
|
|
8
8
|
back: (id) => inv('browser.back', { id }),
|
|
9
9
|
list: () => inv('browser.list').then((r) => r.tabs),
|
|
10
10
|
onTabs: (cb) => subscribe('browser.tabs', (d) => cb(d.tabs)),
|
|
11
|
+
open: ({ url, closeCurrent, appId, title, icon, kind }) => inv('browser.openApp', { url, closeCaller: closeCurrent, appId, title, icon, kind }),
|
|
11
12
|
};
|
|
12
13
|
}
|
|
13
14
|
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/native/facades/browser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/native/facades/browser.ts"],"names":[],"mappings":"AA+CA,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,SAAoB;IACtE,MAAM,GAAG,GAAG,CAAI,EAAU,EAAE,CAAW,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAe,CAAC;IACxE,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAiB,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAO,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QACjE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAO,gBAAgB,EAAE,EAAE,EAAE,EAAE,CAAC;QACnD,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAO,eAAe,EAAE,EAAE,EAAE,EAAE,CAAC;QACjD,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAO,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC;QAC/C,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAyB,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAE,CAA4B,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACxD,GAAG,CAAO,iBAAiB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;KAC7F,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAmC,KAAK,WAAW,EAAE,KAAK,WAAW,EAAiB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvI,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAgBjD,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,UAAU,CAc3E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;CACrB,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAmC,KAAK,WAAW,EAAE,KAAK,WAAW,EAAiB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvI,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAgBjD,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,UAAU,CAc3E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;CACrB,GAAG,UAAU,CA8Ib;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE;QAAE,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,CAAC;IAC7C;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;CACxD,GAAG,UAAU,CAgCb;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,EAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GACZ,IAAI,CAON"}
|
package/dist/native/proxy.js
CHANGED
|
@@ -133,6 +133,19 @@ export function enableUglyProxy(opts) {
|
|
|
133
133
|
client.close();
|
|
134
134
|
void ensureConnected();
|
|
135
135
|
}));
|
|
136
|
+
// Re-attempt the CURRENT host WITHOUT re-picking — the mobile "Retry" button on the
|
|
137
|
+
// disconnect overlay. Unlike proxy:switch (which clears the host and re-picks), this
|
|
138
|
+
// pins the last host so ensureConnected targets it even after close() clears the live
|
|
139
|
+
// client's id, giving a silent one-tap reconnect with no host-picker detour.
|
|
140
|
+
native.subscribe('proxy:retry', (() => {
|
|
141
|
+
const current = preferredHost ?? client.hostDeviceId();
|
|
142
|
+
if (current)
|
|
143
|
+
preferredHost = current;
|
|
144
|
+
forceRepick = false;
|
|
145
|
+
if (client.isOpen())
|
|
146
|
+
client.close();
|
|
147
|
+
void ensureConnected();
|
|
148
|
+
}));
|
|
136
149
|
// task.event:<id> subscriptions need a host-side fanout handshake (task.listen) — unlike
|
|
137
150
|
// process/net streams, whose fanout is registered by the spawning invoke. Ref-count per
|
|
138
151
|
// task id so N local subscribers share one host subscription (no duplicate event delivery).
|
|
@@ -209,6 +222,11 @@ export function enableUglyProxy(opts) {
|
|
|
209
222
|
*/
|
|
210
223
|
export function installProxyClient(opts) {
|
|
211
224
|
const win = opts.win ?? globalThis;
|
|
225
|
+
// Self-heal a stale grant: if the host rejects our fingerprint, our MSK no longer matches
|
|
226
|
+
// (e.g. the host's key drifted/reset). Ask the native shell to destroy the local key and
|
|
227
|
+
// re-enroll — it re-adopts the host's current key with no manual re-pair. Debounced, since
|
|
228
|
+
// re-enrollment takes several seconds and rtc:error repeats on every retry.
|
|
229
|
+
let lastReenroll = 0;
|
|
212
230
|
const client = createProxyClient({
|
|
213
231
|
socket: opts.socket,
|
|
214
232
|
selfDeviceId: opts.selfDeviceId,
|
|
@@ -216,6 +234,14 @@ export function installProxyClient(opts) {
|
|
|
216
234
|
iceServers: opts.iceServers,
|
|
217
235
|
rtcFactory: opts.rtcFactory,
|
|
218
236
|
onEvent: (event, data) => dispatchNativeEvent(win, event, data),
|
|
237
|
+
onFingerprintReject: () => {
|
|
238
|
+
const now = Date.now();
|
|
239
|
+
if (now - lastReenroll < 30_000)
|
|
240
|
+
return;
|
|
241
|
+
lastReenroll = now;
|
|
242
|
+
console.error('[uglyproxy] fingerprint rejected — destroying stale key + re-enrolling');
|
|
243
|
+
void opts.native.invoke('proxy.reenroll', {}).catch(() => { });
|
|
244
|
+
},
|
|
219
245
|
});
|
|
220
246
|
if (opts.inspectHost) {
|
|
221
247
|
installInspectProxyHost({
|
package/dist/native/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAsE,MAAM,kBAAkB,CAAC;AACvI,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAG3E,4FAA4F;AAC5F,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,IAAI;IACJ,SAAS;IACT,KAAK;IACL,OAAO;IACP,SAAS;IACT,UAAU;IACV,SAAS;IACT,KAAK;IACL,SAAS;IACT,QAAQ;IACR,MAAM;IACN,mFAAmF;IACnF,uFAAuF;IACvF,qFAAqF;IACrF,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACpF,OAAO,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,IAAmB;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvG,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,CAAC,CAAC,OAAe,EAAE,OAAgB,EAAE,EAAE;YAC7C,IAAI,WAAW,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,wBAAwB,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/D,0EAA0E;gBAC1E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAgB,EAAE,OAAgB,CAAC,CAAC;QACzD,CAAC,CAAyB;QAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAG/B;IACC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,UAAU,GAA4B,IAAI,CAAC;IAC/C,IAAI,SAA6B,CAAC;IAClC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,gFAAgF;IAChF,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,SAAkB,EAAQ,EAAE;QAC5D,KAAK,MAAM,CAAC,MAAM,CAAC,iBAA0B,EAAE,EAAE,KAAK,EAAE,SAAS,EAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChG,CAAC,CAAC;IAEF,KAAK,UAAU,eAAe;QAC5B,IAAI,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAClC,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC;gBACH,yEAAyE;gBACzE,MAAM,QAAQ,GAAG,aAAa,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC/E,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC9F,IAAI,QAAQ,EAAE,CAAC;oBACb,+DAA+D;oBAC/D,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;oBACrC,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAC/B,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;oBAClC,aAAa,GAAG,IAAI,CAAC;oBACrB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACtE,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,WAAW,GAAG,KAAK,CAAC;gBACpB,SAAS,CAAC,YAAY,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvC,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjH,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAyB,EAAE;oBAC7D,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;iBACzG,CAAC,CAAgC,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjE,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBAAC,OAAO,KAAK,CAAC;gBAAC,CAAC;gBACjD,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;gBACrE,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvF,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAG,CAAW,EAAE,OAAO,EAAE,KAAK,EAAG,CAAW,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrH,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACtD,OAAO,KAAK,CAAC;YACf,CAAC;oBAAS,CAAC;gBACT,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,mFAAmF;IACnF,0EAA0E;IAC1E,MAAM,CAAC,SAAS,CAAC,cAAuB,EAAE,CAAC,GAAG,EAAE;QAC9C,WAAW,GAAG,IAAI,CAAC;QACnB,aAAa,GAAG,IAAI,CAAC;QACrB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,eAAe,EAAE,CAAC;IACzB,CAAC,CAAU,CAAC,CAAC;IAEb,yEAAyE;IACzE,6EAA6E;IAC7E,MAAM,CAAC,SAAS,CAAC,eAAwB,EAAE,CAAC,CAAC,IAAa,EAAE,EAAE;QAC5D,MAAM,CAAC,GAAG,IAAyD,CAAC;QACpE,IAAI,CAAC,CAAC,EAAE,QAAQ;YAAE,OAAO;QACzB,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC3B,IAAI,CAAC,CAAC,KAAK;YAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;QACjC,WAAW,GAAG,KAAK,CAAC;QACpB,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,QAAQ;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5E,KAAK,eAAe,EAAE,CAAC;IACzB,CAAC,CAAU,CAAC,CAAC;IAEb,yFAAyF;IACzF,wFAAwF;IACxF,4FAA4F;IAC5F,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6E,CAAC;IAEtG,MAAM,SAAS,GAAG,CAAC,CAAC,KAAa,EAAE,EAA2B,EAAE,EAAE;QAChE,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,KAAc,EAAE,EAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACnB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACpD,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5B,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC;oBAAE,OAAO;gBAC3D,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;oBAClE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;wBAAC,GAAG,CAAC,WAAW,EAAE,CAAC;wBAAC,OAAO;oBAAC,CAAC;oBACrD,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC;oBAC1B,kFAAkF;oBAClF,4DAA4D;oBAC5D,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;wBAAE,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAChF,CAAC;gBAAC,MAAM,CAAC;oBACP,8EAA8E;gBAChF,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,GAAG,EAAE;YACV,GAAG,EAAE,CAAC;YACN,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;gBAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;QACnF,CAAC,CAAC;IACJ,CAAC,CAA4B,CAAC;IAE9B,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;YACnD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,OAAgB,EAAE,OAAgB,CAAC,CAAC;YACzF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC;gBAAE,MAAM,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAC9F,IAAI,CAAC;gBACH,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,iFAAiF;gBACjF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,eAAe,EAAE,CAAC;oBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC1F,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC,CAAyB;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAelC;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAK,UAAgE,CAAC;IAC1F,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,13 @@ export interface ProxyClientOpts {
|
|
|
33
33
|
rtcFactory?: RTCFactory;
|
|
34
34
|
/** evt frames from the host (UglyNative subscribe events, task deltas) land here. */
|
|
35
35
|
onEvent?: (event: string, data: unknown) => void;
|
|
36
|
+
/**
|
|
37
|
+
* The host rejected our offer with `fingerprint-auth-failed` — i.e. our MSK no longer
|
|
38
|
+
* matches the host's (a stale/invalid grant). The shell can self-heal by destroying the
|
|
39
|
+
* local key and re-enrolling. Deterministic (not a transient error), so it's a reliable
|
|
40
|
+
* trigger; callers should debounce (re-enroll takes time).
|
|
41
|
+
*/
|
|
42
|
+
onFingerprintReject?: () => void;
|
|
36
43
|
requestTimeoutMs?: number;
|
|
37
44
|
openTimeoutMs?: number;
|
|
38
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyClient.d.ts","sourceRoot":"","sources":["../../src/native/proxyClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,WAAW,CAO5E;AAED,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChE,kDAAkD;IAClD,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,iBAAiB,CAAC;AAEzE,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB;2EACuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,qFAAqF;IACrF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjC,iFAAiF;IACjF,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,yDAAyD;IACzD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;IACtG,MAAM,IAAI,OAAO,CAAC;IAClB,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACf;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"proxyClient.d.ts","sourceRoot":"","sources":["../../src/native/proxyClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,WAAW,CAO5E;AAED,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChE,kDAAkD;IAClD,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,iBAAiB,CAAC;AAEzE,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB;2EACuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,qFAAqF;IACrF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjC,iFAAiF;IACjF,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,yDAAyD;IACzD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;IACtG,MAAM,IAAI,OAAO,CAAC;IAClB,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACf;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAmKpE"}
|
|
@@ -104,10 +104,16 @@ export function createProxyClient(opts) {
|
|
|
104
104
|
channel.onmessage = (e) => onDcMessage(e.data);
|
|
105
105
|
offs.push(opts.socket.on('rtc:answer', (d) => { void onAnswer(rec(d)); }));
|
|
106
106
|
offs.push(opts.socket.on('rtc:ice', (d) => { iceRecv++; void onRemoteIce(rec(d)); }));
|
|
107
|
-
offs.push(opts.socket.on('rtc:error', (d) => {
|
|
108
|
-
|
|
107
|
+
offs.push(opts.socket.on('rtc:error', (d) => {
|
|
108
|
+
if (rec(d)['from'] !== host)
|
|
109
|
+
return;
|
|
110
|
+
const reason = rec(d)['reason'];
|
|
111
|
+
console.error('[uglyproxy] rtc:error from host', { reason });
|
|
109
112
|
cleanup();
|
|
110
|
-
|
|
113
|
+
// A fingerprint mismatch = our grant is stale/invalid; let the shell self-heal.
|
|
114
|
+
if (reason === 'fingerprint-auth-failed')
|
|
115
|
+
opts.onFingerprintReject?.();
|
|
116
|
+
}));
|
|
111
117
|
const opened = new Promise((resolve, reject) => {
|
|
112
118
|
const timer = setTimeout(() => reject(new Error('proxy DataChannel open timeout')), openTimeout);
|
|
113
119
|
channel.onopen = () => { clearTimeout(timer); resolve(); };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyClient.js","sourceRoot":"","sources":["../../src/native/proxyClient.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,yFAAyF;AACzF,0FAA0F;AAC1F,oFAAoF;AACpF,yFAAyF;AACzF,OAAO,EAAE,gBAAgB,EAAoC,MAAM,kBAAkB,CAAC;AAGtF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkC;IAC7D,OAAO;QACL,IAAI,EAAE,KAAK,EAAE,IAAe,EAAE,WAAmB,EAAE,EAAE,CACnD,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG;QAC3E,MAAM,EAAE,KAAK,EAAE,IAAe,EAAE,WAAmB,EAAE,GAAW,EAAE,EAAE,CAClE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE;KAClF,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"proxyClient.js","sourceRoot":"","sources":["../../src/native/proxyClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.730",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
6
6
|
"files": [
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.730";
|
|
@@ -12,6 +12,22 @@ export interface BrowserTab {
|
|
|
12
12
|
* protocol (invoke for actions, subscribe for the tab set). Desktop implements
|
|
13
13
|
* it; other hosts reject. No UglyDesktop bridge.
|
|
14
14
|
*/
|
|
15
|
+
/** Open/focus a dock app (or a plain URL/search) in the Ugly Studio browser. */
|
|
16
|
+
export interface BrowserOpenOpts {
|
|
17
|
+
url: string;
|
|
18
|
+
/** Close the CALLING tab after opening (only if it is the `/home` launcher).
|
|
19
|
+
* The `/home` page sets this so its own search / open-app action replaces the
|
|
20
|
+
* /home tab — the single thing that removes /home. A plain tab/dock switch
|
|
21
|
+
* never closes /home. */
|
|
22
|
+
closeCurrent?: boolean;
|
|
23
|
+
/** Stable dock-app id — a project id (dedups) or a nanoid (generic site/search). */
|
|
24
|
+
appId?: string;
|
|
25
|
+
title?: string;
|
|
26
|
+
icon?: string;
|
|
27
|
+
/** Dock-app kind — the opener declares it (no host-based guessing). */
|
|
28
|
+
kind?: 'app' | 'pwa' | 'web';
|
|
29
|
+
}
|
|
30
|
+
|
|
15
31
|
export interface BrowserFacade {
|
|
16
32
|
newTab(url: string): Promise<number>;
|
|
17
33
|
navigate(id: number, url: string): Promise<void>;
|
|
@@ -20,6 +36,10 @@ export interface BrowserFacade {
|
|
|
20
36
|
back(id: number): Promise<void>;
|
|
21
37
|
list(): Promise<BrowserTab[]>;
|
|
22
38
|
onTabs(cb: (tabs: BrowserTab[]) => void): () => void;
|
|
39
|
+
/** Open/focus a dock app slot for `opts.url`. Dispatches the existing
|
|
40
|
+
* `browser.openApp` channel (iOS/Android/desktop all handle it), mapping
|
|
41
|
+
* `closeCurrent` → the shells' `closeCaller`. */
|
|
42
|
+
open(opts: BrowserOpenOpts): Promise<void>;
|
|
23
43
|
}
|
|
24
44
|
|
|
25
45
|
type Invoke = (channel: string, payload: unknown) => Promise<unknown>;
|
|
@@ -35,5 +55,7 @@ export function createBrowserFacade(invoke: Invoke, subscribe: Subscribe): Brows
|
|
|
35
55
|
back: (id) => inv<void>('browser.back', { id }),
|
|
36
56
|
list: () => inv<{ tabs: BrowserTab[] }>('browser.list').then((r) => r.tabs),
|
|
37
57
|
onTabs: (cb) => subscribe('browser.tabs', (d) => cb((d as { tabs: BrowserTab[] }).tabs)),
|
|
58
|
+
open: ({ url, closeCurrent, appId, title, icon, kind }) =>
|
|
59
|
+
inv<void>('browser.openApp', { url, closeCaller: closeCurrent, appId, title, icon, kind }),
|
|
38
60
|
};
|
|
39
61
|
}
|
package/src/native/proxy.ts
CHANGED
|
@@ -153,6 +153,18 @@ export function enableUglyProxy(opts: {
|
|
|
153
153
|
void ensureConnected();
|
|
154
154
|
}) as never);
|
|
155
155
|
|
|
156
|
+
// Re-attempt the CURRENT host WITHOUT re-picking — the mobile "Retry" button on the
|
|
157
|
+
// disconnect overlay. Unlike proxy:switch (which clears the host and re-picks), this
|
|
158
|
+
// pins the last host so ensureConnected targets it even after close() clears the live
|
|
159
|
+
// client's id, giving a silent one-tap reconnect with no host-picker detour.
|
|
160
|
+
native.subscribe('proxy:retry' as never, (() => {
|
|
161
|
+
const current = preferredHost ?? client.hostDeviceId();
|
|
162
|
+
if (current) preferredHost = current;
|
|
163
|
+
forceRepick = false;
|
|
164
|
+
if (client.isOpen()) client.close();
|
|
165
|
+
void ensureConnected();
|
|
166
|
+
}) as never);
|
|
167
|
+
|
|
156
168
|
// task.event:<id> subscriptions need a host-side fanout handshake (task.listen) — unlike
|
|
157
169
|
// process/net streams, whose fanout is registered by the spawning invoke. Ref-count per
|
|
158
170
|
// task id so N local subscribers share one host subscription (no duplicate event delivery).
|
|
@@ -231,6 +243,11 @@ export function installProxyClient(opts: {
|
|
|
231
243
|
inspectHost?: boolean | { platform?: InspectPlatform };
|
|
232
244
|
}): UglyNative {
|
|
233
245
|
const win = opts.win ?? (globalThis as unknown as { dispatchEvent(e: unknown): boolean });
|
|
246
|
+
// Self-heal a stale grant: if the host rejects our fingerprint, our MSK no longer matches
|
|
247
|
+
// (e.g. the host's key drifted/reset). Ask the native shell to destroy the local key and
|
|
248
|
+
// re-enroll — it re-adopts the host's current key with no manual re-pair. Debounced, since
|
|
249
|
+
// re-enrollment takes several seconds and rtc:error repeats on every retry.
|
|
250
|
+
let lastReenroll = 0;
|
|
234
251
|
const client = createProxyClient({
|
|
235
252
|
socket: opts.socket,
|
|
236
253
|
selfDeviceId: opts.selfDeviceId,
|
|
@@ -238,6 +255,13 @@ export function installProxyClient(opts: {
|
|
|
238
255
|
iceServers: opts.iceServers,
|
|
239
256
|
rtcFactory: opts.rtcFactory,
|
|
240
257
|
onEvent: (event, data) => dispatchNativeEvent(win, event, data),
|
|
258
|
+
onFingerprintReject: () => {
|
|
259
|
+
const now = Date.now();
|
|
260
|
+
if (now - lastReenroll < 30_000) return;
|
|
261
|
+
lastReenroll = now;
|
|
262
|
+
console.error('[uglyproxy] fingerprint rejected — destroying stale key + re-enrolling');
|
|
263
|
+
void opts.native.invoke('proxy.reenroll' as never, {} as never).catch(() => {});
|
|
264
|
+
},
|
|
241
265
|
});
|
|
242
266
|
if (opts.inspectHost) {
|
|
243
267
|
installInspectProxyHost({
|
|
@@ -50,6 +50,13 @@ export interface ProxyClientOpts {
|
|
|
50
50
|
rtcFactory?: RTCFactory;
|
|
51
51
|
/** evt frames from the host (UglyNative subscribe events, task deltas) land here. */
|
|
52
52
|
onEvent?: (event: string, data: unknown) => void;
|
|
53
|
+
/**
|
|
54
|
+
* The host rejected our offer with `fingerprint-auth-failed` — i.e. our MSK no longer
|
|
55
|
+
* matches the host's (a stale/invalid grant). The shell can self-heal by destroying the
|
|
56
|
+
* local key and re-enrolling. Deterministic (not a transient error), so it's a reliable
|
|
57
|
+
* trigger; callers should debounce (re-enroll takes time).
|
|
58
|
+
*/
|
|
59
|
+
onFingerprintReject?: () => void;
|
|
53
60
|
requestTimeoutMs?: number;
|
|
54
61
|
openTimeoutMs?: number;
|
|
55
62
|
}
|
|
@@ -152,7 +159,14 @@ export function createProxyClient(opts: ProxyClientOpts): ProxyClient {
|
|
|
152
159
|
|
|
153
160
|
offs.push(opts.socket.on('rtc:answer', (d) => { void onAnswer(rec(d)); }));
|
|
154
161
|
offs.push(opts.socket.on('rtc:ice', (d) => { iceRecv++; void onRemoteIce(rec(d)); }));
|
|
155
|
-
offs.push(opts.socket.on('rtc:error', (d) => {
|
|
162
|
+
offs.push(opts.socket.on('rtc:error', (d) => {
|
|
163
|
+
if (rec(d)['from'] !== host) return;
|
|
164
|
+
const reason = rec(d)['reason'];
|
|
165
|
+
console.error('[uglyproxy] rtc:error from host', { reason });
|
|
166
|
+
cleanup();
|
|
167
|
+
// A fingerprint mismatch = our grant is stale/invalid; let the shell self-heal.
|
|
168
|
+
if (reason === 'fingerprint-auth-failed') opts.onFingerprintReject?.();
|
|
169
|
+
}));
|
|
156
170
|
|
|
157
171
|
const opened = new Promise<void>((resolve, reject) => {
|
|
158
172
|
const timer = setTimeout(() => reject(new Error('proxy DataChannel open timeout')), openTimeout);
|