rnxsim 0.1.419 → 0.1.420

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.
Files changed (59) hide show
  1. package/cli/cloud-client.ts +164 -12
  2. package/cli/cloud-dispatch.ts +7 -2
  3. package/cli/commands/box/checkout-plane.ts +78 -40
  4. package/cli/commands/platform.ts +30 -9
  5. package/cli/outbound-endpoints.ts +6 -0
  6. package/cli/shell-init.ts +1 -1
  7. package/cli/ws-bridge.ts +7 -5
  8. package/dist-lib/agent-daemon-client.cjs +1 -1
  9. package/dist-lib/agent-events.cjs +1 -1
  10. package/dist-lib/agent-identity.cjs +1 -1
  11. package/dist-lib/agent-sessions.cjs +1 -1
  12. package/dist-lib/attached-projects.cjs +1 -1
  13. package/dist-lib/auth/shared-session.cjs +1 -1
  14. package/dist-lib/backend-origin.cjs +1 -1
  15. package/dist-lib/beta.cjs +1 -1
  16. package/dist-lib/beta.mjs +1 -1
  17. package/dist-lib/bridge-constants.cjs +1 -1
  18. package/dist-lib/bridge-contract-input.cjs +1 -1
  19. package/dist-lib/bridge-contract-input.mjs +1 -1
  20. package/dist-lib/bridge-contract.cjs +1 -1
  21. package/dist-lib/bridge-contract.mjs +1 -1
  22. package/dist-lib/capture-contract.cjs +1 -1
  23. package/dist-lib/capture-contract.mjs +1 -1
  24. package/dist-lib/cli-constants.cjs +1 -1
  25. package/dist-lib/cloud-contract.cjs +1 -1
  26. package/dist-lib/cloud-contract.mjs +1 -1
  27. package/dist-lib/config.cjs +1 -1
  28. package/dist-lib/detox/index.cjs +1 -1
  29. package/dist-lib/dev-bundle-resolution.cjs +6 -4
  30. package/dist-lib/home-paths.cjs +1 -1
  31. package/dist-lib/host/bridge-host.cjs +55 -28
  32. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  33. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  34. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  35. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  36. package/dist-lib/host/websocket-proxy.cjs +1 -1
  37. package/dist-lib/index.cjs +7 -5
  38. package/dist-lib/jump-to-source-babel.cjs +1 -1
  39. package/dist-lib/menu.cjs +1 -1
  40. package/dist-lib/menu.mjs +1 -1
  41. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  42. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  43. package/dist-lib/metro-production-bundle.cjs +1 -1
  44. package/dist-lib/metro-production-bundle.mjs +1 -1
  45. package/dist-lib/metro.cjs +4 -3
  46. package/dist-lib/profiles.cjs +1 -1
  47. package/dist-lib/public-brand.cjs +1 -1
  48. package/dist-lib/react-native-host-modules.cjs +1 -1
  49. package/dist-lib/react-native-host-modules.mjs +1 -1
  50. package/dist-lib/render-mode.cjs +1 -1
  51. package/dist-lib/scripts/dev-server-scanner.cjs +9 -6
  52. package/dist-lib/sdk.cjs +1 -1
  53. package/dist-lib/sdk.mjs +1 -1
  54. package/dist-lib/skills.cjs +64 -34
  55. package/dist-lib/vite.cjs +1 -1
  56. package/package.json +1 -1
  57. package/scripts/dev-server-scanner.ts +9 -5
  58. package/src/dev-bundle-resolution.ts +6 -3
  59. package/src/dev-server-open.ts +3 -2
@@ -53,7 +53,7 @@ const EXEC_EXIT_GRACE_MS = 2_000
53
53
  * `/__server-scan` stops answering at all instead of answering "could not
54
54
  * look". so we race the child against a real wall-clock deadline and reject
55
55
  * with `killed`, which callers already read as could-not-look. */
56
- function execGuarded(
56
+ async function execGuarded(
57
57
  command: string,
58
58
  timeout: number,
59
59
  extra: { maxBuffer?: number } = {},
@@ -65,8 +65,9 @@ function execGuarded(
65
65
  else resolve({ stdout })
66
66
  })
67
67
  })
68
+ let deadlineTimer: ReturnType<typeof setTimeout> | undefined
68
69
  const deadline = new Promise<never>((_resolve, reject) => {
69
- const timer = setTimeout(() => {
70
+ deadlineTimer = setTimeout(() => {
70
71
  child?.kill('SIGKILL')
71
72
  const err = new Error(`\`${command}\` did not exit within ${timeout}ms`)
72
73
  // matches the shape `wasKilledByTimeout` reads off a real exec timeout, so
@@ -74,9 +75,13 @@ function execGuarded(
74
75
  Object.assign(err, { killed: true })
75
76
  reject(err)
76
77
  }, timeout + EXEC_EXIT_GRACE_MS)
77
- timer.unref?.()
78
78
  })
79
- return Promise.race([ran, deadline])
79
+ try {
80
+ return await Promise.race([ran, deadline])
81
+ } finally {
82
+ // the race is settled, so drop the deadline rather than leaving it pending.
83
+ clearTimeout(deadlineTimer)
84
+ }
80
85
  }
81
86
 
82
87
  export interface DiscoveredServer {
@@ -234,7 +239,6 @@ function httpGet(
234
239
  // the only thing that ever destroys a connection here. by BODY_TIMEOUT_MS a
235
240
  // server has long since answered or died, so there is no live write to cut.
236
241
  const abandon = setTimeout(() => req.destroy(), BODY_TIMEOUT_MS)
237
- abandon.unref?.()
238
242
  req.on('close', () => {
239
243
  clearTimeout(giveUp)
240
244
  clearTimeout(abandon)
@@ -179,12 +179,15 @@ async function probeExpoManifest(
179
179
  async (res) => (res.ok ? { ok: true as const, body: await res.text() } : null),
180
180
  () => undefined,
181
181
  )
182
+ let probeDeadline: ReturnType<typeof setTimeout> | undefined
182
183
  const answered = await Promise.race([
183
184
  pending,
184
- new Promise<'timeout'>((resolve) =>
185
- setTimeout(() => resolve('timeout'), MANIFEST_PROBE_TIMEOUT_MS).unref?.(),
186
- ),
185
+ new Promise<'timeout'>((resolve) => {
186
+ probeDeadline = setTimeout(() => resolve('timeout'), MANIFEST_PROBE_TIMEOUT_MS)
187
+ }),
187
188
  ])
189
+ // the race is settled, so drop the deadline rather than leaving it pending.
190
+ clearTimeout(probeDeadline)
188
191
  if (answered === 'timeout' || answered === undefined) return { state: 'no-answer' }
189
192
  if (answered === null) return { state: 'no-manifest' }
190
193
  body = answered.body
@@ -129,9 +129,11 @@ export function openRnxDesktopWhenMetroIsReady({
129
129
 
130
130
  return new Promise((resolve) => {
131
131
  let finished = false
132
+ let retryTimer: ReturnType<typeof setTimeout> | undefined
132
133
  const finish = (opened: boolean) => {
133
134
  if (finished) return
134
135
  finished = true
136
+ clearTimeout(retryTimer)
135
137
  scheduledMetroOpens.delete(key)
136
138
  resolve(opened)
137
139
  }
@@ -144,8 +146,7 @@ export function openRnxDesktopWhenMetroIsReady({
144
146
  finish(false)
145
147
  return
146
148
  }
147
- const timer = setTimeout(check, intervalMs)
148
- timer.unref()
149
+ retryTimer = setTimeout(check, intervalMs)
149
150
  }
150
151
  const check = () => {
151
152
  const request = http.get(