@expo/serve-sim 0.6.3 → 0.6.4-canary-20261009-e4e11f5
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/README.md +6 -3
- package/dist/middleware.js +2 -2
- package/dist/serve-sim.js +94 -94
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -248,9 +248,9 @@ capture session are ready. Both endpoints return JSON and disable caching.
|
|
|
248
248
|
|
|
249
249
|
### Launching an app
|
|
250
250
|
|
|
251
|
-
`--launch-app-identifier <bundle-id>`
|
|
252
|
-
|
|
253
|
-
`
|
|
251
|
+
`--launch-app-identifier <bundle-id>` waits for Simulator boot to finish, then launches
|
|
252
|
+
an already-installed app before the preview becomes ready. Install the app beforehand
|
|
253
|
+
(`xcrun simctl install`). Startup fails if boot, launch or opening the URL fails.
|
|
254
254
|
|
|
255
255
|
```sh
|
|
256
256
|
serve-sim --launch-app-identifier host.exp.Exponent \
|
|
@@ -266,6 +266,9 @@ Launching from `serve-sim` rather than beforehand matters because a second `simc
|
|
|
266
266
|
on a running app is a no-op: it neither restarts the app nor applies new arguments. Owning
|
|
267
267
|
the launch is what lets `serve-sim` attach to the process from the start.
|
|
268
268
|
|
|
269
|
+
See [session startup](https://github.com/expo/expo-device-hub/blob/main/llp/0011-serve-sim-session-startup.explainer.md)
|
|
270
|
+
for the startup order, readiness boundary, and teardown ownership.
|
|
271
|
+
|
|
269
272
|
### Camera
|
|
270
273
|
|
|
271
274
|
`serve-sim camera <bundle-id>` replaces the simulator's camera feed for a single app. A small host-side helper writes BGRA frames into a POSIX shared-memory region; an injected dylib (`DYLD_INSERT_LIBRARIES`) swizzles AVFoundation inside the simulator process so the app reads from that region instead of the simulator's stub camera.
|
package/dist/middleware.js
CHANGED
|
@@ -106,7 +106,7 @@ ${X}`});return v.length>0?`${v.join(`
|
|
|
106
106
|
`)}
|
|
107
107
|
`:""}function C0($){let v=BK($.capabilities),J=Buffer.byteLength(v,"utf8");if(J>=mU-1)throw Error(`Capability config is ${J} bytes, over the ${mU} byte limit the capability loader can read. The capability loader would load nothing. Disable capabilities you are not using, or shorten the environment values passed to them.`);return v}function o4($){return HK(Y$(),`capabilities-${$}.conf`)}function yv($,v){zK(Y$(),{recursive:!0});let J=o4($),U=`${J}.${process.pid}.tmp`;jK(U,v),DK(U,J)}function OK($){return HK(Y$(),`capability-inserts-${$}.json`)}function g0($){let v;try{v=VL(OK($),"utf8")}catch(U){if(U.code==="ENOENT")return[];throw U}let J=JSON.parse(v);if(!Array.isArray(J)||!J.every((U)=>typeof U==="string"&&MK(U)&&!U.includes(":")))throw Error(`Invalid startup capability ownership for ${$}. Reboot the simulator before repairing its state.`);return J}function v1($,v){zK(Y$(),{recursive:!0});let J=OK($),U=`${J}.${process.pid}.tmp`;jK(U,JSON.stringify([...new Set(v)])),DK(U,J)}var mU=65536,PL;var lU=Q$(()=>{P4();PL={userApps:"user",allApps:"all"}});import{existsSync as AL,mkdirSync as TL,readFileSync as RL,renameSync as EL,unlinkSync as qL,writeFileSync as SL}from"fs";import{join as kL}from"path";function CL($){return $==="userApps"||$==="allApps"}function iU($){return kL(Y$(),`launch-${$}.json`)}function cU($){if($===null)return!1;try{return process.kill($,0),!1}catch{return!0}}function Z4($,v){let J;try{J=JSON.parse(RL(iU($),"utf-8"))}catch{return null}if(typeof J!=="object"||J===null)return null;let{bundleId:U,launchArgs:_,capabilities:Q,sessionPids:X}=J;return{...typeof U==="string"&&U?{bundleId:U}:{},launchArgs:Array.isArray(_)?_.filter((W)=>typeof W==="string"):[],capabilities:gL(Q,v),...Array.isArray(X)?{sessionPids:X.filter((W)=>Number.isInteger(W)&&W>0&&!cU(W))}:{}}}function gL($,v){if(typeof $!=="object"||$===null)return{};let J={};for(let[U,_]of Object.entries($)){if(typeof _!=="object"||_===null)continue;let{name:Q,dylib:X,scope:W,bundleId:I,ownerPid:Y}=_;if(typeof Q!=="string"||typeof X!=="string"||!CL(W))continue;let G=typeof Y==="number"?Y:null;if(G!==v&&cU(G))continue;J[U]={..._,bundleId:typeof I==="string"?I:null,ownerPid:G}}return J}function pU($){try{qL(iU($))}catch{}}function oU($,v){if(!AL(Y$()))TL(Y$(),{recursive:!0});let J=iU($),U=`${J}.${process.pid}.tmp`;SL(U,JSON.stringify(v)),EL(U,J)}var rU=Q$(()=>{P4()});import{existsSync as tU,readFileSync as VK,rmSync as wL,unlinkSync as bL}from"fs";import{basename as fL,join as PK}from"path";function yL(){return PK(p4(import.meta.url),"..","dist","capability-loader")}function TK(){return[...nv]}function nL($){let v=fL($);return v===AK||v==="libServeSimTrampoline.dylib"}function RK($,v=[]){return $.split(":").map((J)=>J.trim()).filter((J)=>J!==""&&!nL(J)&&!v.includes(J))}async function dU($){return(await x$(["spawn",$,"launchctl","getenv",_1],15000)).trim()}function EK($){return Object.values($).filter((v)=>v.loadPhase==="startup"||v.loadPhase==="startupAndDeferred").map((v)=>v.dylib)}async function uL($,v,J=Z4($)?.capabilities??{},U=g0($)){let _=EK(J),Q=RK(await dU($),U),X=[...new Set([...Q,v,..._])].join(":");v1($,[...U,..._]),await x$(["spawn",$,"launchctl","setenv",w0,o4($)],15000),await x$(["spawn",$,"launchctl","setenv",_1,X],15000),v1($,_),nv.add($)}async function hL($){let v=null;try{v=VK(o4($),"utf8")}catch(Q){if(Q.code!=="ENOENT")throw Q}let J=g0($),U=await dU($),_=(await x$(["spawn",$,"launchctl","getenv",w0],15000)).trim();return{config:v,configPath:_,insert:U,startupDylibs:J}}async function LK($,v,J){await x$(["spawn",$,"launchctl",...J?["setenv",v,J]:["unsetenv",v]],15000)}async function mL($,v,J){if(v1($,[...v.startupDylibs,...J]),v.config===null)wL(o4($),{force:!0});else yv($,v.config);await LK($,w0,v.configPath),await LK($,_1,v.insert),v1($,v.startupDylibs)}function lL($){for(let v of $)if(!tU(v))throw Error(`Startup capability not built: ${v}. Rebuild the native artifacts before enabling it.`)}async function uv($,v){let J=C0(v),U=EK(v.capabilities);lL(U);let _=await hL($),Q=Z4($)?.capabilities??{},X=Object.fromEntries(Object.entries(v.capabilities).filter(([I,Y])=>JSON.stringify(Q[I])===JSON.stringify(Y))),W=C0({...v,capabilities:X});try{if(yv($,W),await uL($,hv(),v.capabilities,_.startupDylibs),J!==W)yv($,J);oU($,v)}catch(I){try{await mL($,_,U)}catch(Y){throw new x0([I,Y],`Could not restore capability launch state on ${$}. Retry cleanup before launching apps.`)}throw I}}function hv(){return PK(yL(),AK)}async function qK($){let v=hv();if(!tU(v))throw Error(`Capability loader not found at ${v}, so capabilities on ${$} cannot be restored. Rebuild serve-sim's native artifacts and try again.`);nv.add($),await vU($,async()=>{let J=Z4($)??{launchArgs:[],capabilities:{}};await uv($,{...J,sessionPids:[...new Set([...J.sessionPids??[],process.pid])]})})}async function iL($){await x$(["spawn",$,"launchctl","unsetenv",w0],15000).catch(()=>{return});let v=RK(await dU($),g0($)).join(":");await x$(v===""?["spawn",$,"launchctl","unsetenv",_1]:["spawn",$,"launchctl","setenv",_1,v],15000),v1($,[]);try{bL(o4($))}catch{}nv.delete($)}function SK($,v,J){if(!v.exclusive)return!1;let U=Z4($)?.capabilities[v.name];return U!==void 0&&U.ownerPid!==J}function cL($,v,J){if(SK($,v,J))throw Error(`Capability ${v.name} on ${$} belongs to another session. Stop that session before enabling it here.`)}async function kK($,v,{bundleId:J=null,options:U={},enabled:_,relaunch:Q=!0,ownerPid:X=process.pid}){let W={udid:$,bundleId:J,options:U,enabled:_};await vU($,async()=>{if(!_){if(!SK($,v,X))await dL($,J,v.name,{relaunch:!1});await v.setEnabled(W);return}cL($,v,X);let I=await NK(v,W);if(!I)throw Error(`Capability ${v.name} declined to start on ${$}. Check its configuration and retry.`);if(await pL($,J,[I],X),Q){let Y=Z4($);if(Y)await aU($,J,Y)}})}async function pL($,v,J,U=process.pid){let _=Z4($);try{let Q=J.map(({capability:X})=>X);await oL($,v,Q,{relaunch:!1,ownerPid:U})}catch(Q){let X=nU(J,Q);if(Q instanceof x0){if(X.length>0)throw new x0([Q,...X],Q.message);throw Q}throw await uU($,J,Q,X),Q}try{for(let{resources:Q}of J)Q.committed?.()}catch(Q){let X=nU(J,Q);try{if(_)await uv($,_);else await iL($),pU($)}catch(W){throw new x0([Q,W,...X],`Could not withdraw a failed capability on ${$}; its resources were kept. Retry cleanup before launching apps.`)}throw await uU($,J,Q,X),Q}}async function oL($,v,J,{relaunch:U=!0,ownerPid:_=process.pid}={}){if(J.length===0)return;let Q=hv();if(!tU(Q))throw Error(`Capability loader not built: ${Q} is missing. Run \`bun run packages/serve-sim/build.ts\` to build the native artifacts, then retry.`);let X=Z4($),W=Object.fromEntries(J.map((Y)=>[Y.name,{...Y,bundleId:v,ownerPid:_}])),I={...X??{launchArgs:[],capabilities:{}},capabilities:{...X?.capabilities,...W}};if(await uv($,I),U)await aU($,v,I)}async function rL($,v){let J=await x$(["spawn",$,"launchctl","list"],15000).catch(()=>null);if(J===null)return null;return J.includes(`UIKitApplication:${v}`)}async function tL($,v){try{await x$(["terminate",$,v],ZK);return}catch{}let J=await rL($,v);if(J===!1)return;throw Error(J===null?`Could not stop ${v} on ${$}, and could not check whether it is still running. Relaunching now would do nothing if it is. Check the simulator and retry.`:`Could not stop ${v} on ${$}, so it cannot be relaunched with its capabilities loaded. simctl terminate did not take effect within ${ZK/1000}s. Stop the app yourself and retry.`)}async function aU($,v,J){let U=v??J.bundleId;if(!U)return;let _=U===J.bundleId?J.launchArgs:[];await tL($,U),await x$(["launch",$,U,..._])}async function FK($,v){try{return await uv($,v),!0}catch(J){if(!fv(J))throw J;return oU($,v),!1}}async function dL($,v,J,{relaunch:U=!0}={}){let _=Z4($);if(!_||!(J in _.capabilities)){if(g0($).length>0)await FK($,_??{launchArgs:[],capabilities:{}});return}let Q=Object.fromEntries(Object.entries(_.capabilities).filter(([I])=>I!==J)),X={..._,capabilities:Q},W=await FK($,X);if(U&&W)await aU($,v,X)}async function CK($,v,J={},U=x$){let _=Z4($)?.capabilities[v];if(!_||Object.entries(J).some(([K,N])=>_.env?.[K]!==N))return!1;let Q=o4($);if((await U(["spawn",$,"launchctl","getenv",w0])).trim()!==Q)return!1;let X;try{X=VK(Q,"utf8")}catch(K){if(K.code==="ENOENT")return!1;throw K}let W=C0({launchArgs:[],capabilities:{[v]:_}}).trimEnd().split(`
|
|
108
108
|
`),I=new Set(X.split(`
|
|
109
|
-
`));if(!W.every((K)=>I.has(K)))return!1;let Y=(await U(["spawn",$,"launchctl","getenv",_1])).trim().split(":"),G=_.loadPhase==="startup"||_.loadPhase==="startupAndDeferred";return Y.includes(hv())&&(!G||Y.includes(_.dylib))}var AK="libServeSimCapabilityLoader.dylib",_1="DYLD_INSERT_LIBRARIES",w0="SERVE_SIM_CAPABILITIES_CONFIG",ZK=15000,nv,x0;var mv=Q$(()=>{KK();lU();rU();zv();k0();Z0();bv();rU();lU();zv();nv=new Set;x0=class x0 extends AggregateError{}});import{existsSync as aL,mkdtempSync as eL,readFileSync as sL,rmSync as $F,writeFileSync as vF}from"node:fs";import{tmpdir as _F}from"node:os";import{join as b0}from"node:path";async function gK($,v){let J=eL(b0(_F(),"serve-sim-ca-")),U=b0(J,"capture-root.crt");try{vF(U,v),await x$(["keychain",$,"add-root-cert",U])}finally{$F(J,{recursive:!0,force:!0})}}function JF(){return[b0(eU,"simnet",sU),b0(eU,"..","dist","simnet",sU),b0(eU,"..","..","dist","simnet",sU)]}function xK(){return JF().find(($)=>aL($))??null}async function wK($,v,J={}){let U;try{U=Number(sL(v,"utf8").trim())}catch(_){if(_.code==="ENOENT")return!1;throw _}if(!Number.isInteger(U)||U<1||U>65535||J.expectedPort!==void 0&&U!==J.expectedPort)return!1;return CK($,"networkCapture",{SIMNET_PROXY_PORT_FILE:v},J.read)}var eU,sU="libSimNetProxy.dylib";var bK=Q$(()=>{mv();Z0();bv();eU=p4(import.meta.url)});import{readFileSync as UF}from"node:fs";import{dirname as QF,join as XF}from"node:path";import{fileURLToPath as WF}from"node:url";function lv(){return"0.6.
|
|
109
|
+
`));if(!W.every((K)=>I.has(K)))return!1;let Y=(await U(["spawn",$,"launchctl","getenv",_1])).trim().split(":"),G=_.loadPhase==="startup"||_.loadPhase==="startupAndDeferred";return Y.includes(hv())&&(!G||Y.includes(_.dylib))}var AK="libServeSimCapabilityLoader.dylib",_1="DYLD_INSERT_LIBRARIES",w0="SERVE_SIM_CAPABILITIES_CONFIG",ZK=15000,nv,x0;var mv=Q$(()=>{KK();lU();rU();zv();k0();Z0();bv();rU();lU();zv();nv=new Set;x0=class x0 extends AggregateError{}});import{existsSync as aL,mkdtempSync as eL,readFileSync as sL,rmSync as $F,writeFileSync as vF}from"node:fs";import{tmpdir as _F}from"node:os";import{join as b0}from"node:path";async function gK($,v){let J=eL(b0(_F(),"serve-sim-ca-")),U=b0(J,"capture-root.crt");try{vF(U,v),await x$(["keychain",$,"add-root-cert",U])}finally{$F(J,{recursive:!0,force:!0})}}function JF(){return[b0(eU,"simnet",sU),b0(eU,"..","dist","simnet",sU),b0(eU,"..","..","dist","simnet",sU)]}function xK(){return JF().find(($)=>aL($))??null}async function wK($,v,J={}){let U;try{U=Number(sL(v,"utf8").trim())}catch(_){if(_.code==="ENOENT")return!1;throw _}if(!Number.isInteger(U)||U<1||U>65535||J.expectedPort!==void 0&&U!==J.expectedPort)return!1;return CK($,"networkCapture",{SIMNET_PROXY_PORT_FILE:v},J.read)}var eU,sU="libSimNetProxy.dylib";var bK=Q$(()=>{mv();Z0();bv();eU=p4(import.meta.url)});import{readFileSync as UF}from"node:fs";import{dirname as QF,join as XF}from"node:path";import{fileURLToPath as WF}from"node:url";function lv(){return"0.6.4-canary-20261009-e4e11f5"}var $9=()=>{};class yK{#$=new Map;enqueue($,v){let J=this.#$.get($),U=J?J.then(v):v(),_=U.then(()=>{},()=>{});return this.#$.set($,_),_.then(()=>{if(this.#$.get($)===_)this.#$.delete($)}),U}devices(){return this.#$.keys()}}function iv($,v){return{schemaVersion:R0,udid:$,proxyAddress:null,attachment:"not-enabled",attachError:null,droppedOversizedBodies:0,fields:[...v]}}function nK($,v){return{...iv($,v),attachment:"failed",attachError:"Capture was turned off while it was waiting to start. Enable it again to retry."}}function J1($,v){if(v.cancelled)throw new f4(nK($,v.fields))}function KF($){if(uK.add($),fK)return;fK=!0,process.on("exit",NF)}function NF(){for(let $ of uK)$()}function v9($={}){let v=$.fields??P6,J=$.startProxy??((Z,T)=>WK(Z,T)),U=$.trustCa??gK,_=$.configure??kK,Q=$.dylib??xK,X=$.isInjected??((Z,T,k)=>wK(Z,T,{expectedPort:Number(new URL(`http://${k}`).port)})),W=$.checkIntervalMs??IF,I=$.writeDiskArtifacts!==!1,Y=$.creatorVersion??"0.0.0",G=new Map,K=()=>{for(let Z of G.values())try{Z.disk?.discardSync()}catch{}},N=new Map,z=new yK,j=new Map,L=null,P=new Map,V=new Map,O=(Z,T)=>{for(let k of P.get(Z)??[])try{k(T)}catch{}},F=(Z)=>G.get(Z)?.meta??V.get(Z)??iv(Z,v),A=(Z,T)=>{if(!I)return{disk:null,stopDisk:null};if(!$.captureDirFor)zU([...G.keys(),Z]);let k=$.captureDirFor?{dir:$.captureDirFor(Z),networkCapturePath:void 0,harPath:void 0}:Vv(Z),g=new V6({dir:k.dir,networkCapturePath:k.networkCapturePath,harPath:k.harPath,creatorVersion:Y,flushIntervalMs:$.flushIntervalMs,harRebuildIntervalMs:GF});return KF(K),{disk:g,stopDisk:g.attach(T)}},R=async(Z,T)=>{if(T.cleanup??=(async()=>{await T.proxy?.close(),T.proxy=null,T.meta.proxyAddress=null,await T.stopDisk?.(),T.stopDisk=null,T.disk=null})().catch((k)=>{throw T.cleanup=void 0,console.warn(`Network capture: cleanup for ${Z} failed:`,k),k}),await T.cleanup,G.get(Z)===T)G.delete(Z)},B=async(Z,T)=>{if(L)throw Error(L);if(T)J1(Z,T);let k=G.get(Z);if(k?.proxy){if(k.meta.attachment==="failed")throw Error("The previous capture session failed. Disable capture before retrying so its launch configuration can be removed safely.");return{dylib:M(),env:{SIMNET_PROXY_PORT_FILE:k.proxy.portFile}}}let g=M(),u=[...T?.fields??v],m=new E0,h={schemaVersion:R0,udid:Z,proxyAddress:null,attachment:"starting",attachError:null,droppedOversizedBodies:0,fields:u},n={store:m,meta:h,proxy:null,...A(Z,m)};m.subscribe((l)=>{if(G.get(Z)===n)O(Z,l)}),V.delete(Z),G.set(Z,n),O(Z,{type:"cleared"}),O(Z,{type:"meta",meta:h});try{let l=await J(m,{fields:u,onUnexpectedExit:(t)=>{if(G.get(Z)!==n)return;h.attachment="failed",h.attachError=`${t}
|
|
110
110
|
|
|
111
111
|
Relaunch apps after restarting capture; their existing sessions may still point at the stopped proxy.`,m.publishMeta(h)},onOversizedControlBody:()=>{if(G.get(Z)!==n)return;h.droppedOversizedBodies+=1,m.publishMeta(h)}});if(n.proxy=l,h.proxyAddress=l.address,T)J1(Z,T);if(await U(Z,await l.caPem()),T)J1(Z,T);if(h.attachment==="failed")throw Error(h.attachError??"The capture proxy stopped during startup.");return{dylib:g,env:{SIMNET_PROXY_PORT_FILE:l.portFile},committed(){if(h.attachment==="failed")throw Error(h.attachError??"The capture proxy stopped during startup.");h.attachment="capturing",m.publishMeta(h)},failed(t){h.attachment="failed",h.attachError=t instanceof Error?t.message:String(t),m.publishMeta(h)},async rollback(){if(T)T.failed=!0;await R(Z,n),G.set(Z,n)}}}catch(l){if(T)T.failed=!0;throw h.attachment="failed",h.attachError=l instanceof Error?l.message:String(l),await R(Z,n),G.set(Z,n),m.publishMeta(h),l}};function M(){let Z=Q();if(!Z)throw Error("Network capture library is missing. Rebuild serve-sim's native artifacts before enabling capture.");return Z}let H={name:"networkCapture",exclusive:!0,scope:"userApps",loadPhase:"startupAndDeferred",defaultEnabled:!1,async setEnabled({udid:Z,enabled:T}){if(T)return B(Z);let k=G.get(Z);if(k)await R(Z,k);if(V.delete(Z),!G.has(Z))O(Z,{type:"meta",meta:iv(Z,v)});return null}},D=(Z)=>_(Z,H,{enabled:!1,relaunch:!1}),C=(Z)=>{let T=j.get(Z);if(T)T.cancelled=!0;return j.delete(Z),z.enqueue(Z,()=>D(Z))};return{capability:H,shouldCaptureDevice(Z,T){return N.get(Z)??T},setDeviceCaptureEnabled(Z,T){N.set(Z,T)},creatorVersion:Y,setFields(Z){v=Z},enableForDevice(Z){let T=j.get(Z);if(T&&!T.failed)return T.promise;let k={cancelled:!1,failed:!1,fields:[...v],promise:Promise.resolve(iv(Z,v))},g=z.enqueue(Z,async()=>{J1(Z,k);try{if(L)throw Error(L);if(G.get(Z)?.meta.attachment==="failed")await D(Z),J1(Z,k);if(await _(Z,{...H,setEnabled:({enabled:n})=>n?B(Z,k):H.setEnabled({udid:Z,enabled:!1,bundleId:null,options:{}})},{enabled:!0,relaunch:!1}),k.cancelled)await D(Z),J1(Z,k);let h=G.get(Z);if(!h)throw Error("The capture session disappeared during startup. Enable capture again.");return h.meta}catch(m){k.failed=!0;let h=G.get(Z),n=h?.meta??nK(Z,k.fields);if(n.attachment="failed",n.attachError=m instanceof Error?m.message:String(m),h)h.store.publishMeta(n);else V.set(Z,n),O(Z,{type:"meta",meta:n});throw new f4(n)}});k.promise=g,j.set(Z,k);let u=()=>{if(j.get(Z)===k)j.delete(Z)};return g.then(u,u),g},disableForDevice:C,refuseCapture(Z){L=Z},async disableAll(){let Z=new Set([...G.keys(),...V.keys(),...z.devices()]),k=(await Promise.allSettled([...Z].map(C))).flatMap((g)=>g.status==="rejected"?[g.reason]:[]);if(k.length>0)throw AggregateError(k,`Could not disable network capture on ${k.length} device(s).`)},discardArtifactsSync:K,subscribe(Z,T){let k=P.get(Z);if(!k)P.set(Z,k=new Set);return k.add(T),{meta:F(Z),unsubscribe:()=>{if(k.delete(T),k.size===0&&P.get(Z)===k)P.delete(Z)}}},metaFor(Z){return F(Z)},async refreshForDevice(Z){let T=G.get(Z);if(!T)return F(Z);if(T.meta.attachment!=="capturing"||!T.proxy)return T.meta;let k=Date.now();if(T.checking)return T.checking;if(T.checkedAt!==void 0&&k-T.checkedAt<W)return T.meta;let g=T.proxy.portFile,u=T.proxy.address;return T.checking=(async()=>{try{let m;try{m=await X(Z,g,u)}catch(h){if(!fv(h))return console.warn(`Network capture: injection probe for ${Z} failed:`,h instanceof Error?h.message:h),T.injectMisses=0,T.meta;m=!1}if(m)return T.injectMisses=0,T.meta;if(G.get(Z)!==T||T.meta.attachment!=="capturing")return T.meta;if(T.injectMisses=(T.injectMisses??0)+1,T.injectMisses<YF)return T.meta;return T.meta.attachment="failed",T.meta.attachError="This device stopped capturing. It may have restarted or shut down since capture was enabled. Enable capture again after it boots.",T.store.publishMeta(T.meta),T.meta}finally{T.checkedAt=Date.now(),T.checking=void 0}})(),T.checking},storeFor(Z){return G.get(Z)?.store??null},artifactPathsFor(Z){let T=G.get(Z)?.disk;if(!T)return null;return{networkCapturePath:T.networkCapturePath,harPath:T.harPath,entriesPath:T.entriesPath}},async flushEntriesPathFor(Z){let T=G.get(Z)?.disk;if(!T)return null;return await T.flushEntries(),T.entriesPath},async flushHarPathFor(Z){let T=G.get(Z)?.disk;if(!T)return null;return await T.flush(),T.harPath},clearForDevice(Z){let T=G.get(Z);if(!T)return!1;return T.store.clear(),!0},throughputFor(Z){let T=G.get(Z);if(!T||T.meta.attachment!=="capturing")return null;return T.store.throughput()}}}var f4,IF=1e4,YF=2,GF=60000,uK,fK=!1,P$;var cv=Q$(()=>{k0();bK();mv();Pv();L0();yU();$9();f4=class f4 extends Error{meta;constructor($){super($.attachError??"Network capture could not start");this.name="CaptureEnableError",this.meta=$}};uK=new Set;P$=v9({creatorVersion:lv()})});var mK=O6((Xf,hK)=>{var U1=1000,Q1=U1*60,X1=Q1*60,T6=X1*24,zF=T6*7,DF=T6*365.25;hK.exports=function($,v){v=v||{};var J=typeof $;if(J==="string"&&$.length>0)return jF($);else if(J==="number"&&isFinite($))return v.long?HF($):MF($);throw Error("val is not a non-empty string or a valid number. val="+JSON.stringify($))};function jF($){if($=String($),$.length>100)return;var v=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec($);if(!v)return;var J=parseFloat(v[1]),U=(v[2]||"ms").toLowerCase();switch(U){case"years":case"year":case"yrs":case"yr":case"y":return J*DF;case"weeks":case"week":case"w":return J*zF;case"days":case"day":case"d":return J*T6;case"hours":case"hour":case"hrs":case"hr":case"h":return J*X1;case"minutes":case"minute":case"mins":case"min":case"m":return J*Q1;case"seconds":case"second":case"secs":case"sec":case"s":return J*U1;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return J;default:return}}function MF($){var v=Math.abs($);if(v>=T6)return Math.round($/T6)+"d";if(v>=X1)return Math.round($/X1)+"h";if(v>=Q1)return Math.round($/Q1)+"m";if(v>=U1)return Math.round($/U1)+"s";return $+"ms"}function HF($){var v=Math.abs($);if(v>=T6)return pv($,v,T6,"day");if(v>=X1)return pv($,v,X1,"hour");if(v>=Q1)return pv($,v,Q1,"minute");if(v>=U1)return pv($,v,U1,"second");return $+" ms"}function pv($,v,J,U){var _=v>=J*1.5;return Math.round($/J)+" "+U+(_?"s":"")}});var _9=O6((Wf,lK)=>{function BF($){J.debug=J,J.default=J,J.coerce=I,J.disable=X,J.enable=_,J.enabled=W,J.humanize=mK(),J.destroy=Y,Object.keys($).forEach((G)=>{J[G]=$[G]}),J.names=[],J.skips=[],J.formatters={};function v(G){let K=0;for(let N=0;N<G.length;N++)K=(K<<5)-K+G.charCodeAt(N),K|=0;return J.colors[Math.abs(K)%J.colors.length]}J.selectColor=v;function J(G){let K,N=null,z,j;function L(...P){if(!L.enabled)return;let V=L,O=Number(new Date),F=O-(K||O);if(V.diff=F,V.prev=K,V.curr=O,K=O,P[0]=J.coerce(P[0]),typeof P[0]!=="string")P.unshift("%O");let A=0;P[0]=P[0].replace(/%([a-zA-Z%])/g,(B,M)=>{if(B==="%%")return"%";A++;let H=J.formatters[M];if(typeof H==="function"){let D=P[A];B=H.call(V,D),P.splice(A,1),A--}return B}),J.formatArgs.call(V,P),(V.log||J.log).apply(V,P)}if(L.namespace=G,L.useColors=J.useColors(),L.color=J.selectColor(G),L.extend=U,L.destroy=J.destroy,Object.defineProperty(L,"enabled",{enumerable:!0,configurable:!1,get:()=>{if(N!==null)return N;if(z!==J.namespaces)z=J.namespaces,j=J.enabled(G);return j},set:(P)=>{N=P}}),typeof J.init==="function")J.init(L);return L}function U(G,K){let N=J(this.namespace+(typeof K>"u"?":":K)+G);return N.log=this.log,N}function _(G){J.save(G),J.namespaces=G,J.names=[],J.skips=[];let K=(typeof G==="string"?G:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let N of K)if(N[0]==="-")J.skips.push(N.slice(1));else J.names.push(N)}function Q(G,K){let N=0,z=0,j=-1,L=0;while(N<G.length)if(z<K.length&&(K[z]===G[N]||K[z]==="*"))if(K[z]==="*")j=z,L=N,z++;else N++,z++;else if(j!==-1)z=j+1,L++,N=L;else return!1;while(z<K.length&&K[z]==="*")z++;return z===K.length}function X(){let G=[...J.names,...J.skips.map((K)=>"-"+K)].join(",");return J.enable(""),G}function W(G){for(let K of J.skips)if(Q(G,K))return!1;for(let K of J.names)if(Q(G,K))return!0;return!1}function I(G){if(G instanceof Error)return G.stack||G.message;return G}function Y(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return J.enable(J.load()),J}lK.exports=BF});var cK=O6((iK,ov)=>{iK.formatArgs=ZF;iK.save=LF;iK.load=FF;iK.useColors=OF;iK.storage=VF();iK.destroy=(()=>{let $=!1;return()=>{if(!$)$=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}})();iK.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function OF(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let $;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&($=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt($[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function ZF($){if($[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+$[0]+(this.useColors?"%c ":" ")+"+"+ov.exports.humanize(this.diff),!this.useColors)return;let v="color: "+this.color;$.splice(1,0,v,"color: inherit");let J=0,U=0;$[0].replace(/%[a-zA-Z%]/g,(_)=>{if(_==="%%")return;if(J++,_==="%c")U=J}),$.splice(U,0,v)}iK.log=console.debug||console.log||(()=>{});function LF($){try{if($)iK.storage.setItem("debug",$);else iK.storage.removeItem("debug")}catch(v){}}function FF(){let $;try{$=iK.storage.getItem("debug")||iK.storage.getItem("DEBUG")}catch(v){}if(!$&&typeof process<"u"&&"env"in process)$=process.env.DEBUG;return $}function VF(){try{return localStorage}catch($){}}ov.exports=_9()(iK);var{formatters:PF}=ov.exports;PF.j=function($){try{return JSON.stringify($)}catch(v){return"[UnexpectedJSONParseError]: "+v.message}}});var oK=O6((Yf,pK)=>{pK.exports=($,v=process.argv)=>{let J=$.startsWith("-")?"":$.length===1?"-":"--",U=v.indexOf(J+$),_=v.indexOf("--");return U!==-1&&(_===-1||U<_)}});var dK=O6((Gf,tK)=>{var CF=Y0("os"),rK=Y0("tty"),K4=oK(),{env:w$}=process,r4;if(K4("no-color")||K4("no-colors")||K4("color=false")||K4("color=never"))r4=0;else if(K4("color")||K4("colors")||K4("color=true")||K4("color=always"))r4=1;if("FORCE_COLOR"in w$)if(w$.FORCE_COLOR==="true")r4=1;else if(w$.FORCE_COLOR==="false")r4=0;else r4=w$.FORCE_COLOR.length===0?1:Math.min(parseInt(w$.FORCE_COLOR,10),3);function J9($){if($===0)return!1;return{level:$,hasBasic:!0,has256:$>=2,has16m:$>=3}}function U9($,v){if(r4===0)return 0;if(K4("color=16m")||K4("color=full")||K4("color=truecolor"))return 3;if(K4("color=256"))return 2;if($&&!v&&r4===void 0)return 0;let J=r4||0;if(w$.TERM==="dumb")return J;if(process.platform==="win32"){let U=CF.release().split(".");if(Number(U[0])>=10&&Number(U[2])>=10586)return Number(U[2])>=14931?3:2;return 1}if("CI"in w$){if(["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((U)=>(U in w$))||w$.CI_NAME==="codeship")return 1;return J}if("TEAMCITY_VERSION"in w$)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(w$.TEAMCITY_VERSION)?1:0;if(w$.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in w$){let U=parseInt((w$.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(w$.TERM_PROGRAM){case"iTerm.app":return U>=3?3:2;case"Apple_Terminal":return 2}}if(/-256(color)?$/i.test(w$.TERM))return 2;if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(w$.TERM))return 1;if("COLORTERM"in w$)return 1;return J}function gF($){let v=U9($,$&&$.isTTY);return J9(v)}tK.exports={supportsColor:gF,stdout:J9(U9(!0,rK.isatty(1))),stderr:J9(U9(!0,rK.isatty(2)))}});var $N=O6((eK,tv)=>{var xF=Y0("tty"),rv=Y0("util");eK.init=hF;eK.log=yF;eK.formatArgs=bF;eK.save=nF;eK.load=uF;eK.useColors=wF;eK.destroy=rv.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");eK.colors=[6,2,3,4,5,1];try{let $=dK();if($&&($.stderr||$).level>=2)eK.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221]}catch($){}eK.inspectOpts=Object.keys(process.env).filter(($)=>{return/^debug_/i.test($)}).reduce(($,v)=>{let J=v.substring(6).toLowerCase().replace(/_([a-z])/g,(_,Q)=>{return Q.toUpperCase()}),U=process.env[v];if(/^(yes|on|true|enabled)$/i.test(U))U=!0;else if(/^(no|off|false|disabled)$/i.test(U))U=!1;else if(U==="null")U=null;else U=Number(U);return $[J]=U,$},{});function wF(){return"colors"in eK.inspectOpts?Boolean(eK.inspectOpts.colors):xF.isatty(process.stderr.fd)}function bF($){let{namespace:v,useColors:J}=this;if(J){let U=this.color,_="\x1B[3"+(U<8?U:"8;5;"+U),Q=` ${_};1m${v} \x1B[0m`;$[0]=Q+$[0].split(`
|
|
112
112
|
`).join(`
|
|
@@ -315,5 +315,5 @@ ${h}`)}})();return}if(!k){D.destroy();return}let u=k.device??T;if(AI(k.upstreamP
|
|
|
315
315
|
\r
|
|
316
316
|
`)};let B=async(H)=>{return QH(R,H)},M=yM({path:`${J}/exec-ws`,execToken:W,corsOrigins:Y,ssePrefixes:Ag(J),onUiRequest:O,serveSimBinPath:kg(),onActionResult:(H,D,C)=>Ug(H,D,C),onSseRequest(H,D){let C=new URL(H,D.url),Z=D.headers.get("origin"),T=D.headers.get("sec-fetch-site");return B(new Request(C,{headers:{accept:"text/event-stream",authorization:`Bearer ${W}`,...Z?{origin:Z}:{},...T?{"sec-fetch-site":T}:{}}}))}});return B.handleWebSocket=(H,D)=>{if(D.on("error",()=>D.close()),!j(H.headers.get("host"))||!EU(A0(H),W,{required:I}))return D.close(),!0;if(M(H,D))return!0;if(_H(H,D,{helperProxyTarget:(C)=>cI(C,U),fallbackDevice:$?.device??null,resolveSession:(C)=>N1(C,v)}))return!0;return!1},B.handleUpgrade=(H,D,C)=>{R.handleUpgrade?.(H,D,C)},B}export{Lg as startDeviceInProcess,Ag as sseStreamPaths,mi as simMiddleware,v4 as selectServeSimState,g8 as rewriteStateForRequestHost,Vg as retryPendingCaptureCleanup,l$ as readServeSimStates,oI as previewConfigForState,oH as parseGridPaging,hi as matchInstalledAppByDisplayName,hg as handleNetworkCaptureRequest,ug as handleMetricsRequest,ng as handleLogsRequest,eM as handleCrashesRequest,VI as handleCrashReportRequest,lg as handleCaptureHarRequest,ig as handleCaptureEntriesRequest,mg as handleCaptureBodyRequest,Og as gridStateToken,Zg as gridDeviceState,Fg as enableNetworkCaptureForStartedDevice,sI as disableNetworkCaptureForStoppedDevice,Gg as deviceNameFromBootedNames};
|
|
317
317
|
|
|
318
|
-
//# debugId=
|
|
318
|
+
//# debugId=6906769FEE2717F664756E2164756E21
|
|
319
319
|
//# sourceMappingURL=middleware.js.map
|