serve-sim 0.1.7 → 0.1.8
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/bin/serve-sim-bin +0 -0
- package/dist/serve-sim.js +1 -1
- package/package.json +1 -1
package/bin/serve-sim-bin
CHANGED
|
Binary file
|
package/dist/serve-sim.js
CHANGED
|
@@ -10,7 +10,7 @@ var de=Object.defineProperty;var Ee=(e)=>e;function le(e,_){this[e]=Ee.bind(null
|
|
|
10
10
|
`);let o=x("xcrun",["simctl","spawn",S,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),$=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,y="",c="";o.stdout.on("data",(D)=>{c+=D.toString();let a;while((a=c.indexOf(`
|
|
11
11
|
`))!==-1){let B=c.slice(0,a).trim();if(c=c.slice(a+1),!B)continue;let p;try{p=JSON.parse(B).eventMessage??""}catch{continue}let E=$.exec(p);if(!E)continue;let l=E[1],De=parseInt(E[2],10);if(!Pe(l))continue;if(l===y)continue;y=l,Ue(S,l).then((Te)=>{s.write("data: "+JSON.stringify({bundleId:l,pid:De,isReactNative:Te})+`
|
|
12
12
|
|
|
13
|
-
`)})}}),o.on("close",()=>s.end()),t.on("close",()=>o.kill());return}if(i)i()}}var z,We,Ge,Me,m,M=null;var Q=ve(()=>{z=P(Le(),"serve-sim"),We=new Set(["host.exp.Exponent","dev.expo.Exponent"]),Ge=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],Me=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;m={at:0,booted:null}});import{execSync as f,spawn as Y}from"child_process";import{chmodSync as Xe,existsSync as v,mkdirSync as ee,openSync as _e,closeSync as te,readFileSync as V,unlinkSync as L,writeFileSync as se}from"fs";import{createHash as Ke}from"crypto";import{homedir as xe,networkInterfaces as ze}from"os";import{join as je,resolve as U}from"path";import{tmpdir as ge}from"os";import{join as b}from"path";import{readdirSync as be}from"fs";var T=b(ge(),"serve-sim"),D_=b(T,"server.json");function O(e){return b(T,`server-${e}.json`)}function w(){try{return be(T).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>b(T,e))}catch{return[]}}var d="./serve-sim-bin-
|
|
13
|
+
`)})}}),o.on("close",()=>s.end()),t.on("close",()=>o.kill());return}if(i)i()}}var z,We,Ge,Me,m,M=null;var Q=ve(()=>{z=P(Le(),"serve-sim"),We=new Set(["host.exp.Exponent","dev.expo.Exponent"]),Ge=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],Me=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;m={at:0,booted:null}});import{execSync as f,spawn as Y}from"child_process";import{chmodSync as Xe,existsSync as v,mkdirSync as ee,openSync as _e,closeSync as te,readFileSync as V,unlinkSync as L,writeFileSync as se}from"fs";import{createHash as Ke}from"crypto";import{homedir as xe,networkInterfaces as ze}from"os";import{join as je,resolve as U}from"path";import{tmpdir as ge}from"os";import{join as b}from"path";import{readdirSync as be}from"fs";var T=b(ge(),"serve-sim"),D_=b(T,"server.json");function O(e){return b(T,`server-${e}.json`)}function w(){try{return be(T).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>b(T,e))}catch{return[]}}var d="./serve-sim-bin-18c0s4sq.";function X(){if(!v(T))ee(T,{recursive:!0})}function F(e){if(e)return I(O(e));for(let _ of w()){let t=I(_);if(t)return t}return null}var H={at:0,booted:null};function Qe(){let e=Date.now();if(H.booted&&e-H.at<1000)return H.booted;try{let _=f("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let i of Object.values(t.devices))for(let r of i)if(r.state==="Booted")s.add(r.udid);return H={at:e,booted:s},s}catch{return null}}function I(e){try{if(!v(e))return null;let _=JSON.parse(V(e,"utf-8"));try{process.kill(_.pid,0)}catch{return L(e),null}let t=Qe();if(t&&!t.has(_.device)){console.error(`[serve-sim] Helper pid ${_.pid} is bound to device ${_.device} which is no longer booted \u2014 killing stale helper.`);try{process.kill(_.pid,"SIGTERM")}catch{}try{L(e)}catch{}return null}return _}catch{return null}}function W(){let e=[];for(let _ of w()){let t=I(_);if(t)e.push(t)}return e}function J(e){X(),se(O(e.device),JSON.stringify(e,null,2))}function g(e){if(e)try{L(O(e))}catch{}else for(let _ of w())try{L(_)}catch{}}function Je(){let e=d.startsWith("/$bunfs/");if(!e&&v(d))return d;if(!e){let r=U(import.meta.dir,"../bin/serve-sim-bin");if(v(r))return r;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
|
|
14
14
|
Checked: ${d}, ${r}`)}let _=V(d),t=Ke("sha256").update(_).digest("hex").slice(0,16),s=U(xe(),"Library/Caches/serve-sim");ee(s,{recursive:!0});let i=U(s,`serve-sim-bin-${t}`);if(!v(i)){se(i,_),Xe(i,493);try{f(`codesign -s - -f ${JSON.stringify(i)}`,{stdio:"ignore"})}catch{}}return i}function Se(){try{let e=f("xcrun simctl list devices booted -j",{encoding:"utf-8"}),_=JSON.parse(e);for(let t of Object.values(_.devices))for(let s of t)if(s.state==="Booted")return s.udid}catch{}return null}function ie(){try{let e=f("xcrun simctl list devices -j",{encoding:"utf-8"}),_=JSON.parse(e),t=Object.keys(_.devices).filter((s)=>/SimRuntime\.iOS-/i.test(s)).sort((s,i)=>{let r=(s.match(/iOS-(\d+)-(\d+)/)??[]).slice(1).map(Number),C=(i.match(/iOS-(\d+)-(\d+)/)??[]).slice(1).map(Number);return(C[0]??0)-(r[0]??0)||(C[1]??0)-(r[1]??0)});for(let s of t){let r=(_.devices[s]??[]).find((C)=>C.isAvailable!==!1&&/^iPhone\b/i.test(C.name));if(r)return{udid:r.udid,name:r.name}}}catch{}return null}function Z(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.udid===e)return i.name}catch{}return null}function G(e){if(/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(e))return e;try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.name.toLowerCase()===e.toLowerCase())return i.udid}catch{}console.error(`Could not resolve device: ${e}`),process.exit(1)}function re(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let i of s)if(i.udid===e)return i.state==="Booted"}catch{}return!1}function q(e){try{return process.kill(e,0),!0}catch{return!1}}function k(e){try{process.kill(e,"SIGTERM")}catch{return}let _=Date.now()+500;while(Date.now()<_)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}try{process.kill(e,"SIGKILL")}catch{}let t=Date.now()+500;while(Date.now()<t)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}}function Ze(e){try{let _=f(`lsof -ti tcp:${e}`,{encoding:"utf-8",stdio:"pipe"}).trim();if(!_)return[];let t=process.pid;return _.split(`
|
|
15
15
|
`).map((s)=>parseInt(s,10)).filter((s)=>Number.isFinite(s)&&s!==t)}catch{return[]}}function Ye(e){let _=Ze(e);if(_.length===0)return;console.log(`\x1B[90mPort ${e} busy, killing holder pid(s): ${_.join(", ")}\x1B[0m`);for(let t of _)try{process.kill(t,"SIGKILL")}catch{}Bun.sleepSync(100)}function e_(e){if(!re(e))try{f(`xcrun simctl boot ${e}`,{encoding:"utf-8",stdio:"pipe"})}catch(_){let t=(_.stderr??_.message??"").toLowerCase();if(!t.includes("booted")&&!t.includes("current state"))throw Error(`Failed to boot device ${e}: ${_.stderr||_.message}`)}try{f("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function __(){let e=ze();for(let _ of Object.values(e))for(let t of _??[])if(t.family==="IPv4"&&!t.internal)return t.address;return null}async function Ce(e){let _=new Set(W().map((t)=>t.port));for(let t=e;t<e+100;t++){if(_.has(t))continue;try{return Bun.serve({port:t,fetch:()=>new Response("ok")}).stop(!0),t}catch{continue}}throw Error(`No available port found in range ${e}-${e+99}`)}async function t_(e){e_(e);try{f(`xcrun simctl bootstatus ${e} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(_){if(!re(e))console.error(`Device ${e} failed to reach booted state: ${_.stderr||_.message}`),process.exit(1)}}async function oe(e,_,t,s){let i=!1;for(let C=0;C<30;C++){if(!s())break;try{if((await fetch(`${_}/health`)).ok){i=!0;break}}catch{}await new Promise((n)=>setTimeout(n,100))}if(i){let C=Date.now()+8000;while(Date.now()<C){if(await new Promise((n)=>setTimeout(n,200)),!s()){i=!1;break}try{if(V(t,"utf-8").includes("Capture started"))break}catch{}}}let r="";try{r=V(t,"utf-8").trim()}catch{}return{ready:i,log:r}}async function s_(e){let{helperPath:_,udid:t,port:s,host:i,logFile:r}=e,C=`http://${i}:${s}`;X();let n=_e(r,"w"),A=Y(_,[t,"--port",String(s)],{detached:!0,stdio:["ignore",n,n]});A.unref(),te(n);let S=A.pid,o=!1;A.once("exit",()=>{o=!0});let{ready:$,log:y}=await oe(S,C,r,()=>!o&&q(S));return{ready:$,pid:S,exited:o||!q(S),log:y}}async function S_(e){let{helperPath:_,udid:t,port:s,host:i,logFile:r}=e,C=`http://${i}:${s}`;X();let n=_e(r,"w"),A=Y(_,[t,"--port",String(s)],{detached:!1,stdio:["ignore",n,n]});te(n);let S=A.pid,o=!1;A.once("exit",()=>{o=!0});let{ready:$,log:y}=await oe(S,C,r,()=>!o&&q(S));return{ready:$,child:A,log:y}}async function ne(e,_,t){await t_(e);let s="127.0.0.1",i=Je(),r=je(T,`server-${e}.log`),C={helperPath:i,udid:e,port:_,host:s,logFile:r},n="",A=2;for(let o=1;o<=A;o++){if(Ye(_),t.detach){let $=await s_(C);if($.ready){let y={pid:$.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return J(y),{pid:$.pid}}k($.pid),n=$.log}else{let $=await S_(C);if($.ready){let y={pid:$.child.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return J(y),{pid:$.child.pid,child:$.child}}k($.child.pid),n=$.log}if(o<A)await new Promise(($)=>setTimeout($,500))}let S=n?`Helper failed:
|
|
16
16
|
${n}`:"Helper process failed to start";console.error(S),process.exit(1)}async function i_(e,_,t){let s=e.length>0?e.map(G):(()=>{let S=Se();if(S)return[S];let o=ie();if(!o)console.error("No device specified and no available iOS simulator found."),process.exit(1);if(!t)console.log(`No booted simulator \u2014 booting ${o.name}...`);return[o.udid]})(),i=new Map,r=[],C=_;for(let S of s){let o=F(S);if(o){if(!t){let a=Z(S)??S;if(s.length>1)console.log(`
|