serve-sim 0.1.43-beta.90.1 → 0.1.43

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 CHANGED
Binary file
package/dist/serve-sim.js CHANGED
@@ -111,7 +111,7 @@ Usage:
111
111
  serve-sim permissions reset <permission|all> <bundle-id> [-d <udid|name>]
112
112
  serve-sim permissions list [bundle-id] [-d <udid|name>]
113
113
 
114
- Permissions: ${nS().join(", ")}`),process.exit(1);let s=C.device?J(C.device):t_();if(!s)console.error("No booted simulator. Boot one or pass -d <udid|name>."),process.exit(1);if(C.verb==="list"){let i={udid:s,bundleId:C.bundleId??null,tcc:m$(s,C.bundleId),location:q$(s,C.bundleId),notifications:k$(s,C.bundleId)};console.log(JSON.stringify(i,null,e?0:2)),process.exit(0)}let t=C.bundleId;try{if(C.permission==="all")for(let i of nS())As(s,"reset",i,void 0,t);else As(s,C.verb,C.permission,C.value,t)}catch(i){console.error(i?.message??String(i)),process.exit(1)}if(e)console.log(JSON.stringify({udid:s,verb:C.verb,permission:C.permission,value:C.value??null,bundleId:t}));else{let i=C.value?` (${C.value})`:"";console.log(`\uD83D\uDD10 ${C.verb} ${C.permission}${i} for ${t} on ${s}`)}process.exit(0)}bS();VS();var z_="./serve-sim-bin-6zfkm4h3.";var F_=ve(import.meta.url);function xr(){return"0.1.43-beta.90.1"}function FC(){if(!K(D_))ke(D_,{recursive:!0})}function A_(_){if(_)return BC(Fe(_));for(let e of fe()){let S=BC(e);if(S)return S}return null}var Ke={at:0,booted:null};function zr(){let _=Date.now();if(Ke.booted&&_-Ke.at<1000)return Ke.booted;try{let e=Q("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),S=JSON.parse(e),C=new Set;for(let s of Object.values(S.devices))for(let t of s)if(t.state==="Booted")C.add(t.udid);return Ke={at:_,booted:C},C}catch{return null}}function BC(_){try{if(!K(_))return c_("state file missing %s",_),null;let e=JSON.parse(C_(_,"utf-8"));try{process.kill(e.pid,0)}catch{return c_("helper pid %d dead, removing stale state %s",e.pid,_),J_(_),null}let S=zr();if(S&&!S.has(e.device)){c_("helper pid %d bound to non-booted device %s — killing stale helper",e.pid,e.device),console.error(`[serve-sim] Helper pid ${e.pid} is bound to device ${e.device} which is no longer booted — killing stale helper.`);try{process.kill(e.pid,"SIGTERM")}catch{}try{J_(_)}catch{}return null}return c_("state ok pid=%d device=%s port=%d",e.pid,e.device,e.port),e}catch(e){return c_("readStateFile threw for %s: %o",_,e),null}}function je(){let _=[];for(let e of fe()){let S=BC(e);if(S)_.push(S)}return _}function Yt(_){FC(),Qe(Fe(_.device),JSON.stringify(_,null,2)),c_("wrote state pid=%d device=%s port=%d",_.pid,_.device,_.port)}function De(_){if(_){c_("clearState device=%s",_);try{J_(Fe(_))}catch{}}else{c_("clearState (all)");for(let e of fe())try{J_(e)}catch{}}}function Qr(){let _=z_.startsWith("/$bunfs/");if(!_&&K(z_))return z_;if(!_){let t=r_(F_,"../bin/serve-sim-bin");if(K(t))return t;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
114
+ Permissions: ${nS().join(", ")}`),process.exit(1);let s=C.device?J(C.device):t_();if(!s)console.error("No booted simulator. Boot one or pass -d <udid|name>."),process.exit(1);if(C.verb==="list"){let i={udid:s,bundleId:C.bundleId??null,tcc:m$(s,C.bundleId),location:q$(s,C.bundleId),notifications:k$(s,C.bundleId)};console.log(JSON.stringify(i,null,e?0:2)),process.exit(0)}let t=C.bundleId;try{if(C.permission==="all")for(let i of nS())As(s,"reset",i,void 0,t);else As(s,C.verb,C.permission,C.value,t)}catch(i){console.error(i?.message??String(i)),process.exit(1)}if(e)console.log(JSON.stringify({udid:s,verb:C.verb,permission:C.permission,value:C.value??null,bundleId:t}));else{let i=C.value?` (${C.value})`:"";console.log(`\uD83D\uDD10 ${C.verb} ${C.permission}${i} for ${t} on ${s}`)}process.exit(0)}bS();VS();var z_="./serve-sim-bin-b0p5hfka.";var F_=ve(import.meta.url);function xr(){return"0.1.43"}function FC(){if(!K(D_))ke(D_,{recursive:!0})}function A_(_){if(_)return BC(Fe(_));for(let e of fe()){let S=BC(e);if(S)return S}return null}var Ke={at:0,booted:null};function zr(){let _=Date.now();if(Ke.booted&&_-Ke.at<1000)return Ke.booted;try{let e=Q("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),S=JSON.parse(e),C=new Set;for(let s of Object.values(S.devices))for(let t of s)if(t.state==="Booted")C.add(t.udid);return Ke={at:_,booted:C},C}catch{return null}}function BC(_){try{if(!K(_))return c_("state file missing %s",_),null;let e=JSON.parse(C_(_,"utf-8"));try{process.kill(e.pid,0)}catch{return c_("helper pid %d dead, removing stale state %s",e.pid,_),J_(_),null}let S=zr();if(S&&!S.has(e.device)){c_("helper pid %d bound to non-booted device %s — killing stale helper",e.pid,e.device),console.error(`[serve-sim] Helper pid ${e.pid} is bound to device ${e.device} which is no longer booted — killing stale helper.`);try{process.kill(e.pid,"SIGTERM")}catch{}try{J_(_)}catch{}return null}return c_("state ok pid=%d device=%s port=%d",e.pid,e.device,e.port),e}catch(e){return c_("readStateFile threw for %s: %o",_,e),null}}function je(){let _=[];for(let e of fe()){let S=BC(e);if(S)_.push(S)}return _}function Yt(_){FC(),Qe(Fe(_.device),JSON.stringify(_,null,2)),c_("wrote state pid=%d device=%s port=%d",_.pid,_.device,_.port)}function De(_){if(_){c_("clearState device=%s",_);try{J_(Fe(_))}catch{}}else{c_("clearState (all)");for(let e of fe())try{J_(e)}catch{}}}function Qr(){let _=z_.startsWith("/$bunfs/");if(!_&&K(z_))return z_;if(!_){let t=r_(F_,"../bin/serve-sim-bin");if(K(t))return t;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
115
115
  Checked: ${z_}, ${t}`)}let e=C_(z_),S=TC("sha256").update(e).digest("hex").slice(0,16),C=r_(Xr(),"Library/Caches/serve-sim");ke(C,{recursive:!0});let s=r_(C,`serve-sim-bin-${S}`);if(!K(s)){Qe(s,e),Ir(s,493);try{Q(`codesign -s - -f ${JSON.stringify(s)}`,{stdio:"ignore"})}catch{}}return s}function ei(){try{let _=Q("xcrun simctl list devices -j",{encoding:"utf-8"}),e=JSON.parse(_),S=Object.keys(e.devices).filter((C)=>/SimRuntime\.iOS-/i.test(C)).sort((C,s)=>{let t=(C.match(/iOS-(\d+)-(\d+)/)??[]).slice(1).map(Number),i=(s.match(/iOS-(\d+)-(\d+)/)??[]).slice(1).map(Number);return(i[0]??0)-(t[0]??0)||(i[1]??0)-(t[1]??0)});for(let C of S){let t=(e.devices[C]??[]).find((i)=>i.isAvailable!==!1&&/^iPhone\b/i.test(i.name));if(t)return{udid:t.udid,name:t.name}}}catch{}return null}function _i(_){try{let e=Q("xcrun simctl list devices -j",{encoding:"utf-8"}),S=JSON.parse(e);for(let C of Object.values(S.devices))for(let s of C)if(s.udid===_)return s.name}catch{}return null}function Si(_){try{let e=Q("xcrun simctl list devices -j",{encoding:"utf-8"}),S=JSON.parse(e);for(let C of Object.values(S.devices))for(let s of C)if(s.udid===_)return s.state==="Booted"}catch{}return!1}function M_(_){try{return process.kill(_,0),!0}catch{return!1}}function DC(_){try{process.kill(_,"SIGTERM")}catch{return}let e=Date.now()+500;while(Date.now()<e)try{process.kill(_,0),N_(25)}catch{return}try{process.kill(_,"SIGKILL")}catch{}let S=Date.now()+500;while(Date.now()<S)try{process.kill(_,0),N_(25)}catch{return}}function jr(_){if(!Si(_))try{Q(`xcrun simctl boot ${_}`,{encoding:"utf-8",stdio:"pipe"})}catch(e){let S=(e.stderr??e.message??"").toLowerCase();if(!S.includes("booted")&&!S.includes("current state"))throw Error(`Failed to boot device ${_}: ${e.stderr||e.message}`)}try{Q("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function Jr(){let _=kr();for(let e of Object.values(_))for(let S of e??[])if(S.family==="IPv4"&&!S.internal)return S.address;return null}async function Ci(_){let e=new Set(je().map((S)=>S.port));for(let S=_;S<_+100;S++){if(e.has(S))continue;if(await ss(S))return S}throw Error(`No available port found in range ${_}-${_+99}`)}async function Zr(_){jr(_);try{Q(`xcrun simctl bootstatus ${_} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(e){if(!Si(_))console.error(`Device ${_} failed to reach booted state: ${e.stderr||e.message}`),process.exit(1)}}async function si(_,e,S,C){let s=!1,t=Date.now();Z("waitForHelperReady pid=%d url=%s",_,e);for(let o=0;o<30;o++){if(!C()){Z("helper pid=%d died during /health polling (attempt %d)",_,o);break}try{if((await fetch(`${e}/health`)).ok){s=!0,Z("helper pid=%d /health ok after %dms",_,Date.now()-t);break}}catch{}await new Promise((y)=>setTimeout(y,100))}if(!s)Z("helper pid=%d /health never responded (%dms)",_,Date.now()-t);if(s){let o=Date.now(),y=o+8000,A=!1;while(Date.now()<y){if(await new Promise(($)=>setTimeout($,200)),!C()){Z("helper pid=%d died while awaiting Capture started",_),s=!1;break}try{if(C_(S,"utf-8").includes("Capture started")){A=!0,Z("helper pid=%d saw 'Capture started' after %dms",_,Date.now()-o);break}}catch{}}if(s&&!A)Z("helper pid=%d ready but never logged 'Capture started' within %dms — stream may not produce frames",_,Date.now()-o)}let i="";try{i=C_(S,"utf-8").trim()}catch{}return{ready:s,log:i}}async function Yr(_){let{helperPath:e,udid:S,port:C,host:s,logFile:t}=_,i=`http://${s}:${C}`;FC();let o=xe(t,"w"),y=EC(e,[S,"--port",String(C)],{detached:!0,stdio:["ignore",o,o]});y.unref(),ze(o);let A=y.pid,$=!1;y.once("exit",()=>{$=!0});let{ready:n,log:a}=await si(A,i,t,()=>!$&&M_(A));return{ready:n,pid:A,exited:$||!M_(A),log:a}}async function _o(_){let{helperPath:e,udid:S,port:C,host:s,logFile:t}=_,i=`http://${s}:${C}`;FC();let o=xe(t,"w"),y=EC(e,[S,"--port",String(C)],{detached:!1,stdio:["ignore",o,o]});ze(o);let A=y.pid,$=!1;y.once("exit",()=>{$=!0});let{ready:n,log:a}=await si(A,i,t,()=>!$&&M_(A));return{ready:n,child:y,log:a}}async function ti(_,e,S){Z("startHelper udid=%s port=%d detach=%s",_,e,S.detach),await Zr(_);let C="127.0.0.1",s=Qr(),t=S_(D_,`server-${_}.log`);Z("helper binary=%s logFile=%s",s,t);let i={helperPath:s,udid:_,port:e,host:C,logFile:t},o="",y=2;for(let $=1;$<=y;$++){if(Z("spawn attempt %d/%d",$,y),is(e),S.detach){let n=await Yr(i);if(Z("spawnHelperDetached result ready=%s pid=%d exited=%s",n.ready,n.pid,n.exited),n.ready){let a={pid:n.pid,port:e,device:_,url:`http://${C}:${e}`,streamUrl:`http://${C}:${e}/stream.mjpeg`,wsUrl:`ws://${C}:${e}/ws`};return Yt(a),{pid:n.pid}}DC(n.pid),o=n.log}else{let n=await _o(i);if(Z("spawnHelperAttached result ready=%s pid=%d",n.ready,n.child.pid),n.ready){let a={pid:n.child.pid,port:e,device:_,url:`http://${C}:${e}`,streamUrl:`http://${C}:${e}/stream.mjpeg`,wsUrl:`ws://${C}:${e}/ws`};return Yt(a),{pid:n.child.pid,child:n.child}}DC(n.child.pid),o=n.log}if($<y)await new Promise((n)=>setTimeout(n,500))}let A=o?`Helper failed:
116
116
  ${o}`:"Helper process failed to start";console.error(A),process.exit(1)}async function eo(_,e,S){wS("follow devices=%o startPort=%d",_,e);let C=_.length>0?_.map(J):(()=>{let A=t_();if(A)return[A];let $=ei();if(!$)console.error("No device specified and no available iOS simulator found."),process.exit(1);if(!S)console.log(`No booted simulator — booting ${$.name}...`);return[$.udid]})(),s=new Map,t=[],i=e;for(let A of C){let $=A_(A);if($){if(!S){let T=_i(A)??A;if(C.length>1)console.log(`
117
117
  ==> ${T} (${A}) <==`);console.log(` Already running on port ${$.port}`),console.log(` Stream: ${$.streamUrl}`),console.log(` WebSocket: ${$.wsUrl}`)}t.push($);continue}i=await Ci(i);let{pid:n,child:a}=await ti(A,i,{detach:!1});if(a)s.set(A,a);let E="127.0.0.1",D={pid:n,port:i,device:A,url:`http://${E}:${i}`,streamUrl:`http://${E}:${i}/stream.mjpeg`,wsUrl:`ws://${E}:${i}/ws`};if(t.push(D),!S){let T=_i(A)??A;if(C.length>1)console.log(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "serve-sim",
3
- "version": "0.1.43-beta.90.1",
3
+ "version": "0.1.43",
4
4
  "type": "module",
5
5
  "author": {
6
6
  "name": "Evan Bacon",