peachsim 0.1.527
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/LICENSE +22 -0
- package/README.md +640 -0
- package/cli/app-config.ts +82 -0
- package/cli/app-fonts.ts +388 -0
- package/cli/app-project.ts +59 -0
- package/cli/app-splash.ts +171 -0
- package/cli/app-state-reset.ts +26 -0
- package/cli/auth.ts +184 -0
- package/cli/bin.ts +59 -0
- package/cli/bridge-diagnostics.ts +226 -0
- package/cli/bridge-flow-runner.ts +2806 -0
- package/cli/browser-backend.ts +44 -0
- package/cli/browser-evals.ts +96 -0
- package/cli/cli-update.ts +261 -0
- package/cli/cloud-client.ts +1530 -0
- package/cli/cloud-dispatch.ts +206 -0
- package/cli/cloud-session.ts +227 -0
- package/cli/command-contract.ts +221 -0
- package/cli/command-registry.ts +304 -0
- package/cli/commands/agent-wrapper.ts +1048 -0
- package/cli/commands/agent.ts +439 -0
- package/cli/commands/app-fonts.ts +99 -0
- package/cli/commands/assert.ts +542 -0
- package/cli/commands/auth.ts +71 -0
- package/cli/commands/box/bundle-plane.ts +71 -0
- package/cli/commands/box/checkout-plane.ts +256 -0
- package/cli/commands/box/plane-share.ts +208 -0
- package/cli/commands/box/rnx-command.ts +60 -0
- package/cli/commands/box/search-command.ts +157 -0
- package/cli/commands/box.ts +925 -0
- package/cli/commands/camera.ts +266 -0
- package/cli/commands/cleanup.ts +169 -0
- package/cli/commands/compat.ts +176 -0
- package/cli/commands/config.ts +34 -0
- package/cli/commands/control.ts +2154 -0
- package/cli/commands/cpu-profile.ts +941 -0
- package/cli/commands/daemon-mac-app.ts +165 -0
- package/cli/commands/daemon.ts +800 -0
- package/cli/commands/debug.ts +751 -0
- package/cli/commands/desktop.ts +39 -0
- package/cli/commands/detect.ts +201 -0
- package/cli/commands/detox.ts +481 -0
- package/cli/commands/device.ts +134 -0
- package/cli/commands/diagnose.ts +589 -0
- package/cli/commands/do-chain.ts +408 -0
- package/cli/commands/electron.ts +94 -0
- package/cli/commands/film.ts +379 -0
- package/cli/commands/flow.ts +1240 -0
- package/cli/commands/inspect/actions.ts +516 -0
- package/cli/commands/inspect/core.ts +2086 -0
- package/cli/commands/inspect/count.ts +17 -0
- package/cli/commands/inspect/describe.ts +119 -0
- package/cli/commands/inspect/env.ts +25 -0
- package/cli/commands/inspect/find.ts +169 -0
- package/cli/commands/inspect/get-layout.ts +53 -0
- package/cli/commands/inspect/keyboard.ts +54 -0
- package/cli/commands/inspect/list.ts +175 -0
- package/cli/commands/inspect/memory.ts +215 -0
- package/cli/commands/inspect/redaction.ts +39 -0
- package/cli/commands/inspect/resolve-target.ts +77 -0
- package/cli/commands/inspect/screens.ts +78 -0
- package/cli/commands/inspect/settle.ts +32 -0
- package/cli/commands/inspect/settling.ts +197 -0
- package/cli/commands/inspect/shared.ts +259 -0
- package/cli/commands/inspect/sleep.ts +15 -0
- package/cli/commands/inspect/tree.ts +23 -0
- package/cli/commands/inspect/url.ts +17 -0
- package/cli/commands/inspect/wait-event.ts +211 -0
- package/cli/commands/inspect/wait-idle.ts +25 -0
- package/cli/commands/inspect/wait-ready.ts +87 -0
- package/cli/commands/inspect/wait-selector.ts +59 -0
- package/cli/commands/inspect/wait.ts +32 -0
- package/cli/commands/inspect.ts +4738 -0
- package/cli/commands/install-cli.ts +275 -0
- package/cli/commands/install-desktop.ts +385 -0
- package/cli/commands/login.ts +357 -0
- package/cli/commands/logout.ts +24 -0
- package/cli/commands/maestro-generate.ts +375 -0
- package/cli/commands/maestro.ts +536 -0
- package/cli/commands/mode.ts +58 -0
- package/cli/commands/no-bridge-hint.ts +80 -0
- package/cli/commands/perf.ts +67 -0
- package/cli/commands/permissions.ts +203 -0
- package/cli/commands/platform.ts +410 -0
- package/cli/commands/preview.ts +103 -0
- package/cli/commands/profile.ts +106 -0
- package/cli/commands/react.ts +353 -0
- package/cli/commands/record.ts +1435 -0
- package/cli/commands/report-issue.ts +305 -0
- package/cli/commands/reset.ts +89 -0
- package/cli/commands/runtime.ts +348 -0
- package/cli/commands/screenshot-command.ts +106 -0
- package/cli/commands/screenshot-layers.ts +144 -0
- package/cli/commands/screenshot-mode.ts +38 -0
- package/cli/commands/screenshot.ts +492 -0
- package/cli/commands/screenshots-capture.ts +608 -0
- package/cli/commands/screenshots.ts +127 -0
- package/cli/commands/serve.ts +139 -0
- package/cli/commands/setup.ts +416 -0
- package/cli/commands/shell-boolean-mode.ts +82 -0
- package/cli/commands/skills.ts +468 -0
- package/cli/commands/slides.ts +357 -0
- package/cli/commands/state.ts +94 -0
- package/cli/commands/storage.ts +58 -0
- package/cli/commands/telemetry.ts +55 -0
- package/cli/commands/test.ts +535 -0
- package/cli/commands/three-mode.ts +771 -0
- package/cli/commands/timeline.ts +121 -0
- package/cli/commands/upgrade.ts +167 -0
- package/cli/commands/upload.ts +1203 -0
- package/cli/commands/version.ts +63 -0
- package/cli/commands/welcome.ts +17 -0
- package/cli/commands/what-happened.ts +328 -0
- package/cli/current-sim.ts +217 -0
- package/cli/desktop-companion.ts +315 -0
- package/cli/drivers/electron.ts +70 -0
- package/cli/drivers/index.ts +20 -0
- package/cli/drivers/playwright-provisioning.ts +184 -0
- package/cli/drivers/playwright-sim-host.ts +537 -0
- package/cli/drivers/playwright.ts +209 -0
- package/cli/drivers/registry.ts +65 -0
- package/cli/drivers/types.ts +102 -0
- package/cli/flow-export.ts +55 -0
- package/cli/flow-file.ts +142 -0
- package/cli/flow-live-status.ts +126 -0
- package/cli/flow-session.ts +140 -0
- package/cli/help-core.ts +143 -0
- package/cli/help.ts +44 -0
- package/cli/hidden-runtime-alias.ts +19 -0
- package/cli/hints.ts +214 -0
- package/cli/inspect-notice-state.ts +114 -0
- package/cli/internal-child.ts +176 -0
- package/cli/maestro-js.ts +323 -0
- package/cli/main.ts +704 -0
- package/cli/open-url.ts +8 -0
- package/cli/outbound-endpoints.ts +830 -0
- package/cli/parent-pid.ts +204 -0
- package/cli/parse-args.ts +189 -0
- package/cli/privacy.ts +53 -0
- package/cli/prompt.ts +56 -0
- package/cli/recording-access.ts +108 -0
- package/cli/registry.ts +2 -0
- package/cli/resolve-assets.ts +63 -0
- package/cli/rnx-in-process.ts +98 -0
- package/cli/run-registry.ts +226 -0
- package/cli/run-rnx-core.ts +148 -0
- package/cli/run-rnx.ts +137 -0
- package/cli/runtime-notes.ts +66 -0
- package/cli/runtime-summary.ts +25 -0
- package/cli/secure-file.ts +31 -0
- package/cli/self-invocation.ts +58 -0
- package/cli/send-to-box.ts +109 -0
- package/cli/setup-repository.ts +191 -0
- package/cli/shell-init.ts +98 -0
- package/cli/standalone.ts +4 -0
- package/cli/telemetry.ts +84 -0
- package/cli/ui.ts +68 -0
- package/cli/ws-bridge.ts +1020 -0
- package/detox/attempt-events.cjs +23 -0
- package/detox/colors.ts +54 -0
- package/detox/config-loader.ts +135 -0
- package/detox/element-types.ts +48 -0
- package/detox/expectations.ts +534 -0
- package/detox/gestures.ts +501 -0
- package/detox/index.ts +2694 -0
- package/detox/jest-preset.cjs +29 -0
- package/detox/jest-setup-after-env.cjs +22 -0
- package/detox/matchers.ts +30 -0
- package/detox/motion-change.cjs +109 -0
- package/detox/motion-change.d.cts +35 -0
- package/detox/navigation-lifecycle.ts +290 -0
- package/detox/navigation.ts +43 -0
- package/detox/proof-frame.cjs +114 -0
- package/detox/record-block-execution.cjs +78 -0
- package/detox/screenshots/animated-color-test-rest-norngh.png +0 -0
- package/detox/screenshots/color-test-after-drag-norngh.png +0 -0
- package/detox/screenshots/color-test-rest-norngh.png +0 -0
- package/detox/screenshots/theme-blue-toggle.png +0 -0
- package/detox/screenshots/theme-blue.png +0 -0
- package/detox/screenshots/theme-red-toggle.png +0 -0
- package/detox/screenshots/theme-red.png +0 -0
- package/dist-lib/agent-daemon-client.cjs +502 -0
- package/dist-lib/agent-events.cjs +48 -0
- package/dist-lib/agent-identity.cjs +53 -0
- package/dist-lib/agent-sessions.cjs +759 -0
- package/dist-lib/attached-projects.cjs +526 -0
- package/dist-lib/auth/shared-session.cjs +208 -0
- package/dist-lib/backend-origin.cjs +88 -0
- package/dist-lib/beta.cjs +41 -0
- package/dist-lib/beta.mjs +13 -0
- package/dist-lib/bridge-constants.cjs +161 -0
- package/dist-lib/bridge-contract-input.cjs +451 -0
- package/dist-lib/bridge-contract-input.mjs +414 -0
- package/dist-lib/bridge-contract.cjs +130 -0
- package/dist-lib/bridge-contract.mjs +94 -0
- package/dist-lib/capture-contract.cjs +220 -0
- package/dist-lib/capture-contract.mjs +190 -0
- package/dist-lib/cli-constants.cjs +32 -0
- package/dist-lib/cloud-contract.cjs +194 -0
- package/dist-lib/cloud-contract.mjs +145 -0
- package/dist-lib/cloud.cjs +670 -0
- package/dist-lib/cloud.mjs +639 -0
- package/dist-lib/config.cjs +96 -0
- package/dist-lib/detox/index.cjs +3789 -0
- package/dist-lib/detox/jest-preset.cjs +29 -0
- package/dist-lib/dev-bundle-resolution.cjs +290 -0
- package/dist-lib/home-paths.cjs +638 -0
- package/dist-lib/host/bridge-host.cjs +10903 -0
- package/dist-lib/host/fetch-proxy-handler.cjs +421 -0
- package/dist-lib/host/fetch-proxy-overrides.cjs +63 -0
- package/dist-lib/host/fetch-proxy-overrides.mjs +37 -0
- package/dist-lib/host/replacement-module-handler.cjs +469 -0
- package/dist-lib/host/websocket-proxy.cjs +298 -0
- package/dist-lib/index.cjs +4268 -0
- package/dist-lib/jump-to-source-babel.cjs +93 -0
- package/dist-lib/jump-to-source-native.cjs +112 -0
- package/dist-lib/menu.cjs +646 -0
- package/dist-lib/menu.mjs +604 -0
- package/dist-lib/metro-fingerprint-registry.cjs +186 -0
- package/dist-lib/metro-fingerprint-registry.mjs +156 -0
- package/dist-lib/metro-production-bundle.cjs +329 -0
- package/dist-lib/metro-production-bundle.mjs +295 -0
- package/dist-lib/metro.cjs +904 -0
- package/dist-lib/profiles.cjs +246 -0
- package/dist-lib/public-brand.cjs +39 -0
- package/dist-lib/react-native-host-modules.cjs +51 -0
- package/dist-lib/react-native-host-modules.mjs +25 -0
- package/dist-lib/render-mode.cjs +54 -0
- package/dist-lib/scripts/dev-server-scanner.cjs +1232 -0
- package/dist-lib/sdk.cjs +2433 -0
- package/dist-lib/sdk.mjs +2336 -0
- package/dist-lib/skills.cjs +39132 -0
- package/dist-lib/swift-submit.cjs +92 -0
- package/dist-lib/swift-submit.mjs +65 -0
- package/dist-lib/swift.cjs +1646 -0
- package/dist-lib/vite.cjs +1591 -0
- package/package.json +290 -0
- package/scripts/dev-server-scanner.ts +1291 -0
- package/scripts/optional-demo-registry.ts +113 -0
- package/skills/contrast/SKILL.md +165 -0
- package/skills/rnx-debug/SKILL.md +433 -0
- package/skills/rnx-perf/SKILL.md +399 -0
- package/skills/rnx-setup/SKILL.md +172 -0
- package/skills/rnx-test/SKILL.md +321 -0
- package/skills/rnx-visual/SKILL.md +126 -0
- package/src/agent-daemon-client.ts +410 -0
- package/src/agent-events.ts +71 -0
- package/src/agent-identity.ts +23 -0
- package/src/agent-prompt.ts +71 -0
- package/src/agent-sessions.ts +580 -0
- package/src/app-url.ts +39 -0
- package/src/attached-projects.ts +539 -0
- package/src/auth/shared-session.ts +235 -0
- package/src/backend-origin.ts +70 -0
- package/src/beta.ts +19 -0
- package/src/bridge-constants.ts +175 -0
- package/src/bridge-contract-input.ts +502 -0
- package/src/bridge-contract.ts +558 -0
- package/src/browser-cache.ts +16 -0
- package/src/capture-contract.ts +587 -0
- package/src/cli-constants.ts +1 -0
- package/src/cli-version.ts +40 -0
- package/src/cloud-contract.ts +274 -0
- package/src/cloud.ts +762 -0
- package/src/codex-client.ts +234 -0
- package/src/config.ts +132 -0
- package/src/connect.ts +101 -0
- package/src/dev-bundle-resolution.ts +346 -0
- package/src/dev-server-open.ts +198 -0
- package/src/disk-cleanup.ts +540 -0
- package/src/flow-timeout-scale.ts +15 -0
- package/src/home-paths.ts +806 -0
- package/src/host/agent-host.ts +666 -0
- package/src/host/bridge-host.ts +2788 -0
- package/src/host/fetch-proxy-handler.ts +449 -0
- package/src/host/fetch-proxy-overrides.ts +51 -0
- package/src/host/open-url.ts +89 -0
- package/src/host/plane-host.ts +203 -0
- package/src/host/replacement-module-handler.ts +158 -0
- package/src/host/websocket-proxy.ts +315 -0
- package/src/index.ts +71 -0
- package/src/jump-to-source-babel.ts +135 -0
- package/src/jump-to-source-native.ts +102 -0
- package/src/menu.ts +777 -0
- package/src/metro-fingerprint-registry.ts +302 -0
- package/src/metro-plugin.ts +341 -0
- package/src/metro-production-bundle.ts +471 -0
- package/src/native-dev-bundle-url.ts +118 -0
- package/src/native-seam-manifest.ts +341 -0
- package/src/playwright-host-log.ts +16 -0
- package/src/plist.ts +27 -0
- package/src/poll-until.ts +123 -0
- package/src/profiles.ts +179 -0
- package/src/public-brand.ts +9 -0
- package/src/react-native-host-modules.ts +26 -0
- package/src/render-mode.ts +27 -0
- package/src/rolldown-plugin-swift.ts +240 -0
- package/src/runtime-assets.ts +233 -0
- package/src/runtime-delivery.ts +54 -0
- package/src/screenshots/compose.ts +422 -0
- package/src/screenshots/frame-compose.ts +514 -0
- package/src/screenshots/orchestrate.ts +256 -0
- package/src/screenshots/org-deck.ts +91 -0
- package/src/screenshots/registry.ts +58 -0
- package/src/screenshots/schema.ts +364 -0
- package/src/sdk.ts +15 -0
- package/src/settings-bundle.ts +418 -0
- package/src/shell-bridge-identity.ts +15 -0
- package/src/sim-client.ts +697 -0
- package/src/skills/builtin/a11y-review.ts +132 -0
- package/src/skills/builtin/compat-check.ts +71 -0
- package/src/skills/builtin/maestro-test.ts +121 -0
- package/src/skills/builtin/perf-profile.ts +90 -0
- package/src/skills/builtin/screenshot-all.ts +52 -0
- package/src/skills/builtin/visual-diff.ts +100 -0
- package/src/skills/registry.ts +107 -0
- package/src/skills/types.ts +41 -0
- package/src/swift-submit.ts +185 -0
- package/src/swift.ts +7 -0
- package/src/team-machine-prompt.ts +73 -0
- package/src/vite-plugin-one.ts +264 -0
- package/src/vite-plugin-swift.ts +620 -0
- package/src/vite-plugin.ts +1946 -0
- package/src/worklets-babel.ts +250 -0
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
/*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
|
+
"use strict";
|
|
4
|
+
var __create = Object.create;
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __export = (target, all) => {
|
|
11
|
+
for (var name in all)
|
|
12
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
13
|
+
};
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
23
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
24
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
25
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
26
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
27
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
28
|
+
mod
|
|
29
|
+
));
|
|
30
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
31
|
+
|
|
32
|
+
// src/home-paths.ts
|
|
33
|
+
var home_paths_exports = {};
|
|
34
|
+
__export(home_paths_exports, {
|
|
35
|
+
ACTIVE_RUNTIME_FILE: () => ACTIVE_RUNTIME_FILE,
|
|
36
|
+
CLI_UPDATE_FILE: () => CLI_UPDATE_FILE,
|
|
37
|
+
CONFIG_FILE: () => CONFIG_FILE,
|
|
38
|
+
DAEMON_HEARTBEAT_STALE_MS: () => DAEMON_HEARTBEAT_STALE_MS,
|
|
39
|
+
DAEMON_LOCKFILE: () => DAEMON_LOCKFILE,
|
|
40
|
+
DEV_BRIDGES_DIR: () => DEV_BRIDGES_DIR,
|
|
41
|
+
RNX_HOME_ENV: () => RNX_HOME_ENV,
|
|
42
|
+
activeRuntimeDir: () => activeRuntimeDir,
|
|
43
|
+
activeRuntimeFile: () => activeRuntimeFile,
|
|
44
|
+
cacheDir: () => cacheDir,
|
|
45
|
+
cameraFixturesDir: () => cameraFixturesDir,
|
|
46
|
+
claimDaemonLockfile: () => claimDaemonLockfile,
|
|
47
|
+
cliUpdateFilePath: () => cliUpdateFilePath,
|
|
48
|
+
configFilePath: () => configFilePath,
|
|
49
|
+
consumeRuntimeUpgradeNotice: () => consumeRuntimeUpgradeNotice,
|
|
50
|
+
daemonAppBundlePath: () => daemonAppBundlePath,
|
|
51
|
+
daemonAppDir: () => daemonAppDir,
|
|
52
|
+
daemonAppLauncherPath: () => daemonAppLauncherPath,
|
|
53
|
+
daemonLockfilePath: () => daemonLockfilePath,
|
|
54
|
+
devBridgeLockfilePath: () => devBridgeLockfilePath,
|
|
55
|
+
devBridgesDir: () => devBridgesDir,
|
|
56
|
+
electronDir: () => electronDir,
|
|
57
|
+
electronUserDataDir: () => electronUserDataDir,
|
|
58
|
+
electronVersionDir: () => electronVersionDir,
|
|
59
|
+
ensureRnxHome: () => ensureRnxHome,
|
|
60
|
+
isDaemonLockfileFresh: () => isDaemonLockfileFresh,
|
|
61
|
+
isDevBridgeLockfileFresh: () => isDevBridgeLockfileFresh,
|
|
62
|
+
isDevWorkstation: () => isDevWorkstation,
|
|
63
|
+
isOnboardingComplete: () => isOnboardingComplete,
|
|
64
|
+
isSootsimDevCheckout: () => isSootsimDevCheckout,
|
|
65
|
+
profilesDir: () => profilesDir,
|
|
66
|
+
readActiveRuntime: () => readActiveRuntime,
|
|
67
|
+
readDaemonLockfile: () => readDaemonLockfile,
|
|
68
|
+
readDefaultBox: () => readDefaultBox,
|
|
69
|
+
readDevBridgeLockfiles: () => readDevBridgeLockfiles,
|
|
70
|
+
readLiveRuntimeVersions: () => readLiveRuntimeVersions,
|
|
71
|
+
readOrCreateAnonymousId: () => readOrCreateAnonymousId,
|
|
72
|
+
readPrivacyPreferences: () => readPrivacyPreferences,
|
|
73
|
+
readSharedConfig: () => readSharedConfig,
|
|
74
|
+
readSimulatorDriverPreference: () => readSimulatorDriverPreference,
|
|
75
|
+
removeDaemonLockfile: () => removeDaemonLockfile,
|
|
76
|
+
removeDevBridgeLockfile: () => removeDevBridgeLockfile,
|
|
77
|
+
rnxHomeDir: () => rnxHomeDir,
|
|
78
|
+
runtimeDir: () => runtimeDir,
|
|
79
|
+
runtimeUpgradeNoticePath: () => runtimeUpgradeNoticePath,
|
|
80
|
+
runtimesDir: () => runtimesDir,
|
|
81
|
+
shouldSkipPersistentDaemon: () => shouldSkipPersistentDaemon,
|
|
82
|
+
writeActiveRuntime: () => writeActiveRuntime,
|
|
83
|
+
writeDaemonLockfile: () => writeDaemonLockfile,
|
|
84
|
+
writeDefaultBox: () => writeDefaultBox,
|
|
85
|
+
writeDevBridgeLockfile: () => writeDevBridgeLockfile,
|
|
86
|
+
writeOnboardingPreferences: () => writeOnboardingPreferences,
|
|
87
|
+
writePrivacyPreferences: () => writePrivacyPreferences,
|
|
88
|
+
writeRuntimeUpgradeNotice: () => writeRuntimeUpgradeNotice,
|
|
89
|
+
writeSharedConfig: () => writeSharedConfig
|
|
90
|
+
});
|
|
91
|
+
module.exports = __toCommonJS(home_paths_exports);
|
|
92
|
+
var import_node_crypto = require("node:crypto");
|
|
93
|
+
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
94
|
+
var import_node_os = require("node:os");
|
|
95
|
+
var import_node_path = __toESM(require("node:path"), 1);
|
|
96
|
+
var RNX_HOME_ENV = "RNX_HOME";
|
|
97
|
+
var ACTIVE_RUNTIME_FILE = "active";
|
|
98
|
+
var DAEMON_LOCKFILE = "daemon.json";
|
|
99
|
+
var DEV_BRIDGES_DIR = "dev-bridges";
|
|
100
|
+
var CONFIG_FILE = "config.json";
|
|
101
|
+
var CLI_UPDATE_FILE = "cli-update.json";
|
|
102
|
+
var DAEMON_HEARTBEAT_STALE_MS = 3e4;
|
|
103
|
+
function rnxHomeDir() {
|
|
104
|
+
const override = process.env[RNX_HOME_ENV];
|
|
105
|
+
if (override && override.length > 0) return import_node_path.default.resolve(override);
|
|
106
|
+
return import_node_path.default.join((0, import_node_os.homedir)(), ".rnx");
|
|
107
|
+
}
|
|
108
|
+
function isSootsimDevCheckout() {
|
|
109
|
+
if (process.env.SOOTSIM_FORCE_DAEMON_INSTALL === "1") return false;
|
|
110
|
+
const env = process.env.SOOTSIM_DEV;
|
|
111
|
+
if (env === "1" || env === "true") return true;
|
|
112
|
+
if (env === "0" || env === "false") return false;
|
|
113
|
+
const argv1 = process.argv[1];
|
|
114
|
+
if (!argv1) return false;
|
|
115
|
+
try {
|
|
116
|
+
const real = import_node_fs.default.realpathSync(argv1);
|
|
117
|
+
return real.includes(`${import_node_path.default.sep}packages${import_node_path.default.sep}sootsim${import_node_path.default.sep}`);
|
|
118
|
+
} catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function isDevWorkstation() {
|
|
123
|
+
if (process.env.SOOTSIM_FORCE_DAEMON_INSTALL === "1") return false;
|
|
124
|
+
return process.env.IS_TAMAGUI_DEV === "1";
|
|
125
|
+
}
|
|
126
|
+
function shouldSkipPersistentDaemon() {
|
|
127
|
+
return isSootsimDevCheckout() || isDevWorkstation();
|
|
128
|
+
}
|
|
129
|
+
function runtimesDir() {
|
|
130
|
+
return import_node_path.default.join(rnxHomeDir(), "runtimes");
|
|
131
|
+
}
|
|
132
|
+
function runtimeDir(version) {
|
|
133
|
+
return import_node_path.default.join(runtimesDir(), version);
|
|
134
|
+
}
|
|
135
|
+
function activeRuntimeFile() {
|
|
136
|
+
return import_node_path.default.join(runtimesDir(), ACTIVE_RUNTIME_FILE);
|
|
137
|
+
}
|
|
138
|
+
function electronDir() {
|
|
139
|
+
return import_node_path.default.join(rnxHomeDir(), "electron");
|
|
140
|
+
}
|
|
141
|
+
function electronUserDataDir() {
|
|
142
|
+
return import_node_path.default.join(electronDir(), "userData");
|
|
143
|
+
}
|
|
144
|
+
function electronVersionDir(version) {
|
|
145
|
+
return import_node_path.default.join(electronDir(), version);
|
|
146
|
+
}
|
|
147
|
+
function profilesDir() {
|
|
148
|
+
return import_node_path.default.join(rnxHomeDir(), "profiles");
|
|
149
|
+
}
|
|
150
|
+
function cameraFixturesDir() {
|
|
151
|
+
return import_node_path.default.join(rnxHomeDir(), "camera-fixtures");
|
|
152
|
+
}
|
|
153
|
+
function daemonAppDir() {
|
|
154
|
+
return import_node_path.default.join(rnxHomeDir(), "daemon-app");
|
|
155
|
+
}
|
|
156
|
+
function daemonAppBundlePath() {
|
|
157
|
+
return import_node_path.default.join(daemonAppDir(), "RNX Daemon.app");
|
|
158
|
+
}
|
|
159
|
+
function daemonAppLauncherPath() {
|
|
160
|
+
return import_node_path.default.join(daemonAppBundlePath(), "Contents", "MacOS", "rnx-daemon");
|
|
161
|
+
}
|
|
162
|
+
function cacheDir() {
|
|
163
|
+
return import_node_path.default.join(rnxHomeDir(), "cache");
|
|
164
|
+
}
|
|
165
|
+
function daemonLockfilePath() {
|
|
166
|
+
return import_node_path.default.join(rnxHomeDir(), DAEMON_LOCKFILE);
|
|
167
|
+
}
|
|
168
|
+
function devBridgesDir() {
|
|
169
|
+
return import_node_path.default.join(rnxHomeDir(), DEV_BRIDGES_DIR);
|
|
170
|
+
}
|
|
171
|
+
function devBridgeLockfilePath(bridgePort) {
|
|
172
|
+
if (!Number.isInteger(bridgePort) || bridgePort <= 0) {
|
|
173
|
+
throw new Error(`invalid development bridge port: ${bridgePort}`);
|
|
174
|
+
}
|
|
175
|
+
return import_node_path.default.join(devBridgesDir(), `${bridgePort}.json`);
|
|
176
|
+
}
|
|
177
|
+
function configFilePath() {
|
|
178
|
+
return import_node_path.default.join(rnxHomeDir(), CONFIG_FILE);
|
|
179
|
+
}
|
|
180
|
+
function cliUpdateFilePath() {
|
|
181
|
+
return import_node_path.default.join(rnxHomeDir(), CLI_UPDATE_FILE);
|
|
182
|
+
}
|
|
183
|
+
function readSharedConfig() {
|
|
184
|
+
try {
|
|
185
|
+
const raw = import_node_fs.default.readFileSync(configFilePath(), "utf8");
|
|
186
|
+
const parsed = JSON.parse(raw);
|
|
187
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
188
|
+
} catch {
|
|
189
|
+
return {};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function writeSharedConfig(patch) {
|
|
193
|
+
ensureRnxHome();
|
|
194
|
+
const current = readSharedConfig();
|
|
195
|
+
const next = { ...current, ...patch };
|
|
196
|
+
if (patch.settings && typeof patch.settings === "object") {
|
|
197
|
+
next.settings = {
|
|
198
|
+
...current.settings && typeof current.settings === "object" ? current.settings : {},
|
|
199
|
+
...patch.settings
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const tmp = `${configFilePath()}.tmp`;
|
|
203
|
+
import_node_fs.default.writeFileSync(tmp, `${JSON.stringify(next, null, 2)}
|
|
204
|
+
`, "utf8");
|
|
205
|
+
import_node_fs.default.renameSync(tmp, configFilePath());
|
|
206
|
+
return next;
|
|
207
|
+
}
|
|
208
|
+
var CURRENT_ONBOARDING_VERSION = 1;
|
|
209
|
+
function isOnboardingComplete() {
|
|
210
|
+
return readSharedConfig().onboardingVersion === CURRENT_ONBOARDING_VERSION;
|
|
211
|
+
}
|
|
212
|
+
function readSimulatorDriverPreference() {
|
|
213
|
+
const driver = readSharedConfig().simulatorDriver;
|
|
214
|
+
return driver === "electron" || driver === "playwright" ? driver : null;
|
|
215
|
+
}
|
|
216
|
+
function writeOnboardingPreferences(driver) {
|
|
217
|
+
writeSharedConfig({
|
|
218
|
+
onboardingVersion: CURRENT_ONBOARDING_VERSION,
|
|
219
|
+
simulatorDriver: driver
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
function readPrivacyPreferences() {
|
|
223
|
+
const settings = readSharedConfig().settings;
|
|
224
|
+
const productAnalytics = settings?.productAnalytics;
|
|
225
|
+
const crashReports = settings?.crashReports;
|
|
226
|
+
return {
|
|
227
|
+
productAnalytics: typeof productAnalytics === "boolean" ? productAnalytics : false,
|
|
228
|
+
crashReports: typeof crashReports === "boolean" ? crashReports : false,
|
|
229
|
+
configured: typeof productAnalytics === "boolean" && typeof crashReports === "boolean"
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
function writePrivacyPreferences(preferences) {
|
|
233
|
+
writeSharedConfig({
|
|
234
|
+
settings: {
|
|
235
|
+
productAnalytics: preferences.productAnalytics,
|
|
236
|
+
crashReports: preferences.crashReports
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
function readOrCreateAnonymousId() {
|
|
241
|
+
const existing = readSharedConfig().anonymousId;
|
|
242
|
+
if (typeof existing === "string" && existing.trim()) return existing;
|
|
243
|
+
const created = `anon-cli-${(0, import_node_crypto.randomUUID)()}`;
|
|
244
|
+
writeSharedConfig({ anonymousId: created });
|
|
245
|
+
return created;
|
|
246
|
+
}
|
|
247
|
+
function readDefaultBox() {
|
|
248
|
+
const stored = readSharedConfig().defaultBox;
|
|
249
|
+
if (typeof stored !== "object" || stored === null) return null;
|
|
250
|
+
if (!("boxId" in stored) || typeof stored.boxId !== "string" || !stored.boxId) {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
const name = "name" in stored && typeof stored.name === "string" ? stored.name : null;
|
|
254
|
+
return { boxId: stored.boxId, name };
|
|
255
|
+
}
|
|
256
|
+
function writeDefaultBox(box) {
|
|
257
|
+
writeSharedConfig({ defaultBox: box });
|
|
258
|
+
}
|
|
259
|
+
function runtimeUpgradeNoticePath() {
|
|
260
|
+
return import_node_path.default.join(rnxHomeDir(), "runtime-upgraded.json");
|
|
261
|
+
}
|
|
262
|
+
function writeRuntimeUpgradeNotice(notice) {
|
|
263
|
+
ensureRnxHome();
|
|
264
|
+
const tmp = `${runtimeUpgradeNoticePath()}.tmp`;
|
|
265
|
+
import_node_fs.default.writeFileSync(tmp, `${JSON.stringify(notice)}
|
|
266
|
+
`, "utf8");
|
|
267
|
+
import_node_fs.default.renameSync(tmp, runtimeUpgradeNoticePath());
|
|
268
|
+
}
|
|
269
|
+
function consumeRuntimeUpgradeNotice() {
|
|
270
|
+
try {
|
|
271
|
+
const raw = import_node_fs.default.readFileSync(runtimeUpgradeNoticePath(), "utf8");
|
|
272
|
+
import_node_fs.default.unlinkSync(runtimeUpgradeNoticePath());
|
|
273
|
+
const parsed = JSON.parse(raw);
|
|
274
|
+
if (typeof parsed?.to !== "string" || !parsed.to) return null;
|
|
275
|
+
return {
|
|
276
|
+
from: typeof parsed.from === "string" ? parsed.from : null,
|
|
277
|
+
to: parsed.to,
|
|
278
|
+
at: typeof parsed.at === "number" ? parsed.at : 0
|
|
279
|
+
};
|
|
280
|
+
} catch {
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
function ensureRnxHome() {
|
|
285
|
+
import_node_fs.default.mkdirSync(rnxHomeDir(), { recursive: true });
|
|
286
|
+
import_node_fs.default.mkdirSync(runtimesDir(), { recursive: true });
|
|
287
|
+
import_node_fs.default.mkdirSync(electronDir(), { recursive: true });
|
|
288
|
+
import_node_fs.default.mkdirSync(profilesDir(), { recursive: true });
|
|
289
|
+
import_node_fs.default.mkdirSync(cacheDir(), { recursive: true });
|
|
290
|
+
}
|
|
291
|
+
function readActiveRuntime() {
|
|
292
|
+
try {
|
|
293
|
+
const value = import_node_fs.default.readFileSync(activeRuntimeFile(), "utf8").trim();
|
|
294
|
+
return value.length > 0 ? value : null;
|
|
295
|
+
} catch {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
function writeActiveRuntime(version) {
|
|
300
|
+
import_node_fs.default.mkdirSync(runtimesDir(), { recursive: true });
|
|
301
|
+
import_node_fs.default.writeFileSync(activeRuntimeFile(), `${version}
|
|
302
|
+
`, "utf8");
|
|
303
|
+
}
|
|
304
|
+
function activeRuntimeDir() {
|
|
305
|
+
const version = readActiveRuntime();
|
|
306
|
+
if (!version) return null;
|
|
307
|
+
const dir = runtimeDir(version);
|
|
308
|
+
try {
|
|
309
|
+
if (import_node_fs.default.statSync(dir).isDirectory()) return dir;
|
|
310
|
+
} catch {
|
|
311
|
+
}
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
|
|
315
|
+
var DAEMON_CLAIM_STALE_MS = 3e4;
|
|
316
|
+
function readDaemonLockfile() {
|
|
317
|
+
try {
|
|
318
|
+
const fd = import_node_fs.default.openSync(daemonLockfilePath(), "r");
|
|
319
|
+
try {
|
|
320
|
+
const buf = Buffer.alloc(DAEMON_LOCKFILE_MAX_BYTES);
|
|
321
|
+
const bytesRead = import_node_fs.default.readSync(fd, buf, 0, DAEMON_LOCKFILE_MAX_BYTES, 0);
|
|
322
|
+
const raw = buf.subarray(0, bytesRead).toString("utf8");
|
|
323
|
+
const parsed = JSON.parse(raw);
|
|
324
|
+
if (parsed && parsed.schema === 1 && typeof parsed.pid === "number" && typeof parsed.bridgePort === "number" && typeof parsed.runtimePort === "number" && typeof parsed.startedAt === "number" && typeof parsed.heartbeatAt === "number" && (parsed.servedRuntimes === void 0 || Array.isArray(parsed.servedRuntimes) && parsed.servedRuntimes.every((version) => typeof version === "string"))) {
|
|
325
|
+
return parsed;
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
} finally {
|
|
329
|
+
import_node_fs.default.closeSync(fd);
|
|
330
|
+
}
|
|
331
|
+
} catch {
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function parseDevBridgeLockfile(raw) {
|
|
336
|
+
try {
|
|
337
|
+
const parsed = JSON.parse(raw);
|
|
338
|
+
if (parsed && parsed.schema === 1 && parsed.source === "vite-dev" && typeof parsed.pid === "number" && typeof parsed.bridgePort === "number" && typeof parsed.runtimePort === "number" && typeof parsed.cwd === "string" && typeof parsed.startedAt === "number" && typeof parsed.heartbeatAt === "number" && (parsed.shellPort === void 0 || typeof parsed.shellPort === "number") && (parsed.servedRuntimes === void 0 || Array.isArray(parsed.servedRuntimes) && parsed.servedRuntimes.every((version) => typeof version === "string"))) {
|
|
339
|
+
return parsed;
|
|
340
|
+
}
|
|
341
|
+
return null;
|
|
342
|
+
} catch {
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
function readDevBridgeLockfiles() {
|
|
347
|
+
let entries;
|
|
348
|
+
try {
|
|
349
|
+
entries = import_node_fs.default.readdirSync(devBridgesDir(), { withFileTypes: true });
|
|
350
|
+
} catch {
|
|
351
|
+
return [];
|
|
352
|
+
}
|
|
353
|
+
const lockfiles = [];
|
|
354
|
+
for (const entry of entries) {
|
|
355
|
+
if (!entry.isFile() || !/^\d+\.json$/.test(entry.name)) continue;
|
|
356
|
+
try {
|
|
357
|
+
const filePath = import_node_path.default.join(devBridgesDir(), entry.name);
|
|
358
|
+
const fd = import_node_fs.default.openSync(filePath, "r");
|
|
359
|
+
try {
|
|
360
|
+
const buf = Buffer.alloc(DAEMON_LOCKFILE_MAX_BYTES);
|
|
361
|
+
const bytesRead = import_node_fs.default.readSync(fd, buf, 0, DAEMON_LOCKFILE_MAX_BYTES, 0);
|
|
362
|
+
const lockfile = parseDevBridgeLockfile(
|
|
363
|
+
buf.subarray(0, bytesRead).toString("utf8")
|
|
364
|
+
);
|
|
365
|
+
if (lockfile && entry.name === `${lockfile.bridgePort}.json`) {
|
|
366
|
+
lockfiles.push(lockfile);
|
|
367
|
+
}
|
|
368
|
+
} finally {
|
|
369
|
+
import_node_fs.default.closeSync(fd);
|
|
370
|
+
}
|
|
371
|
+
} catch {
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return lockfiles.sort((left, right) => left.bridgePort - right.bridgePort);
|
|
375
|
+
}
|
|
376
|
+
function isDaemonLockfileFresh(lock, now = Date.now()) {
|
|
377
|
+
if (!lock) return false;
|
|
378
|
+
if (now - lock.heartbeatAt > DAEMON_HEARTBEAT_STALE_MS) return false;
|
|
379
|
+
try {
|
|
380
|
+
process.kill(lock.pid, 0);
|
|
381
|
+
return true;
|
|
382
|
+
} catch {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function isDevBridgeLockfileFresh(lock, now = Date.now()) {
|
|
387
|
+
if (!lock) return false;
|
|
388
|
+
if (now - lock.heartbeatAt > DAEMON_HEARTBEAT_STALE_MS) return false;
|
|
389
|
+
try {
|
|
390
|
+
process.kill(lock.pid, 0);
|
|
391
|
+
return true;
|
|
392
|
+
} catch {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
function readLiveRuntimeVersions() {
|
|
397
|
+
const versions = /* @__PURE__ */ new Set();
|
|
398
|
+
const daemon = readDaemonLockfile();
|
|
399
|
+
if (isDaemonLockfileFresh(daemon)) {
|
|
400
|
+
if (daemon.activeRuntime) versions.add(daemon.activeRuntime);
|
|
401
|
+
for (const version of daemon.servedRuntimes ?? []) versions.add(version);
|
|
402
|
+
}
|
|
403
|
+
for (const devBridge of readDevBridgeLockfiles()) {
|
|
404
|
+
if (!isDevBridgeLockfileFresh(devBridge)) continue;
|
|
405
|
+
for (const version of devBridge.servedRuntimes ?? []) versions.add(version);
|
|
406
|
+
}
|
|
407
|
+
return [...versions].sort();
|
|
408
|
+
}
|
|
409
|
+
function writeDaemonLockfile(data) {
|
|
410
|
+
ensureRnxHome();
|
|
411
|
+
const lockfilePath = daemonLockfilePath();
|
|
412
|
+
const existing = readDaemonLockfile();
|
|
413
|
+
if (!existing) {
|
|
414
|
+
if (createDaemonLockfileExclusive(data)) return;
|
|
415
|
+
throw new Error("another rnx daemon claimed the lockfile before this write");
|
|
416
|
+
}
|
|
417
|
+
if (!sameDaemonOwner(existing, data)) {
|
|
418
|
+
throw new Error("refusing to overwrite another rnx daemon lockfile");
|
|
419
|
+
}
|
|
420
|
+
const tmp = `${lockfilePath}.${data.pid}.${(0, import_node_crypto.randomUUID)()}.tmp`;
|
|
421
|
+
import_node_fs.default.writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
|
|
422
|
+
`, "utf8");
|
|
423
|
+
try {
|
|
424
|
+
const current = readDaemonLockfile();
|
|
425
|
+
if (!current || !sameDaemonOwner(current, data)) {
|
|
426
|
+
throw new Error("rnx daemon lock ownership changed during heartbeat");
|
|
427
|
+
}
|
|
428
|
+
import_node_fs.default.renameSync(tmp, lockfilePath);
|
|
429
|
+
} finally {
|
|
430
|
+
try {
|
|
431
|
+
import_node_fs.default.unlinkSync(tmp);
|
|
432
|
+
} catch {
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function writeDevBridgeLockfile(data) {
|
|
437
|
+
import_node_fs.default.mkdirSync(devBridgesDir(), { recursive: true });
|
|
438
|
+
const lockfilePath = devBridgeLockfilePath(data.bridgePort);
|
|
439
|
+
const tmp = `${lockfilePath}.${data.pid}.tmp`;
|
|
440
|
+
import_node_fs.default.writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
|
|
441
|
+
`, "utf8");
|
|
442
|
+
import_node_fs.default.renameSync(tmp, lockfilePath);
|
|
443
|
+
}
|
|
444
|
+
function sameDaemonOwner(left, right) {
|
|
445
|
+
return left.pid === right.pid && left.startedAt === right.startedAt;
|
|
446
|
+
}
|
|
447
|
+
function isAlreadyExists(error) {
|
|
448
|
+
return error instanceof Error && "code" in error && Reflect.get(error, "code") === "EEXIST";
|
|
449
|
+
}
|
|
450
|
+
function createDaemonLockfileExclusive(data) {
|
|
451
|
+
const lockfilePath = daemonLockfilePath();
|
|
452
|
+
const tmp = `${lockfilePath}.${data.pid}.${(0, import_node_crypto.randomUUID)()}.claim`;
|
|
453
|
+
import_node_fs.default.writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
|
|
454
|
+
`, "utf8");
|
|
455
|
+
try {
|
|
456
|
+
import_node_fs.default.linkSync(tmp, lockfilePath);
|
|
457
|
+
return true;
|
|
458
|
+
} catch (error) {
|
|
459
|
+
if (isAlreadyExists(error)) return false;
|
|
460
|
+
throw error;
|
|
461
|
+
} finally {
|
|
462
|
+
try {
|
|
463
|
+
import_node_fs.default.unlinkSync(tmp);
|
|
464
|
+
} catch {
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
function daemonClaimPath() {
|
|
469
|
+
return `${daemonLockfilePath()}.claim`;
|
|
470
|
+
}
|
|
471
|
+
function parseDaemonClaim(raw) {
|
|
472
|
+
try {
|
|
473
|
+
const value = JSON.parse(raw);
|
|
474
|
+
if (value !== null && typeof value === "object" && typeof Reflect.get(value, "pid") === "number" && typeof Reflect.get(value, "startedAt") === "number" && typeof Reflect.get(value, "createdAt") === "number") {
|
|
475
|
+
return {
|
|
476
|
+
pid: Reflect.get(value, "pid"),
|
|
477
|
+
startedAt: Reflect.get(value, "startedAt"),
|
|
478
|
+
createdAt: Reflect.get(value, "createdAt")
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
} catch {
|
|
482
|
+
}
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
function readDaemonClaim() {
|
|
486
|
+
try {
|
|
487
|
+
return parseDaemonClaim(import_node_fs.default.readFileSync(daemonClaimPath(), "utf8"));
|
|
488
|
+
} catch {
|
|
489
|
+
return null;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function isDaemonClaimFresh(claim, now = Date.now()) {
|
|
493
|
+
if (now - claim.createdAt > DAEMON_CLAIM_STALE_MS) return false;
|
|
494
|
+
try {
|
|
495
|
+
process.kill(claim.pid, 0);
|
|
496
|
+
return true;
|
|
497
|
+
} catch {
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
function acquireDaemonClaim(data) {
|
|
502
|
+
const claim = {
|
|
503
|
+
pid: data.pid,
|
|
504
|
+
startedAt: data.startedAt,
|
|
505
|
+
createdAt: Date.now()
|
|
506
|
+
};
|
|
507
|
+
const serialized = `${JSON.stringify(claim)}
|
|
508
|
+
`;
|
|
509
|
+
for (let attempt = 0; attempt < 8; attempt++) {
|
|
510
|
+
try {
|
|
511
|
+
import_node_fs.default.writeFileSync(daemonClaimPath(), serialized, { encoding: "utf8", flag: "wx" });
|
|
512
|
+
return true;
|
|
513
|
+
} catch (error) {
|
|
514
|
+
if (!isAlreadyExists(error)) throw error;
|
|
515
|
+
}
|
|
516
|
+
const existing = readDaemonClaim();
|
|
517
|
+
if (existing && sameDaemonOwner(existing, claim)) return true;
|
|
518
|
+
if (existing && isDaemonClaimFresh(existing)) return false;
|
|
519
|
+
let before;
|
|
520
|
+
try {
|
|
521
|
+
before = import_node_fs.default.readFileSync(daemonClaimPath(), "utf8");
|
|
522
|
+
const latest = parseDaemonClaim(before);
|
|
523
|
+
if (latest && isDaemonClaimFresh(latest)) return false;
|
|
524
|
+
if (import_node_fs.default.readFileSync(daemonClaimPath(), "utf8") !== before) continue;
|
|
525
|
+
import_node_fs.default.unlinkSync(daemonClaimPath());
|
|
526
|
+
} catch {
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
function releaseDaemonClaim(owner) {
|
|
532
|
+
try {
|
|
533
|
+
const claim = readDaemonClaim();
|
|
534
|
+
if (!claim || !sameDaemonOwner(claim, owner)) return;
|
|
535
|
+
import_node_fs.default.unlinkSync(daemonClaimPath());
|
|
536
|
+
} catch {
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
function claimDaemonLockfile(data) {
|
|
540
|
+
ensureRnxHome();
|
|
541
|
+
if (!acquireDaemonClaim(data)) return false;
|
|
542
|
+
try {
|
|
543
|
+
const existing = readDaemonLockfile();
|
|
544
|
+
if (existing && sameDaemonOwner(existing, data)) {
|
|
545
|
+
writeDaemonLockfile(data);
|
|
546
|
+
return true;
|
|
547
|
+
}
|
|
548
|
+
if (existing && isDaemonLockfileFresh(existing)) return false;
|
|
549
|
+
if (existing) {
|
|
550
|
+
const latest = readDaemonLockfile();
|
|
551
|
+
if (!latest || !sameDaemonOwner(latest, existing)) return false;
|
|
552
|
+
if (isDaemonLockfileFresh(latest)) return false;
|
|
553
|
+
try {
|
|
554
|
+
import_node_fs.default.unlinkSync(daemonLockfilePath());
|
|
555
|
+
} catch {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
return createDaemonLockfileExclusive(data);
|
|
560
|
+
} finally {
|
|
561
|
+
releaseDaemonClaim(data);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
function removeDaemonLockfile(owner) {
|
|
565
|
+
try {
|
|
566
|
+
const lockfile = readDaemonLockfile();
|
|
567
|
+
if (!lockfile || !sameDaemonOwner(lockfile, owner)) return;
|
|
568
|
+
import_node_fs.default.unlinkSync(daemonLockfilePath());
|
|
569
|
+
} catch {
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
function removeDevBridgeLockfile(owner) {
|
|
573
|
+
try {
|
|
574
|
+
const lockfilePath = devBridgeLockfilePath(owner.bridgePort);
|
|
575
|
+
const lockfile = parseDevBridgeLockfile(import_node_fs.default.readFileSync(lockfilePath, "utf8"));
|
|
576
|
+
if (lockfile?.pid !== owner.pid || lockfile.startedAt !== owner.startedAt) return;
|
|
577
|
+
import_node_fs.default.unlinkSync(lockfilePath);
|
|
578
|
+
} catch {
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
582
|
+
0 && (module.exports = {
|
|
583
|
+
ACTIVE_RUNTIME_FILE,
|
|
584
|
+
CLI_UPDATE_FILE,
|
|
585
|
+
CONFIG_FILE,
|
|
586
|
+
DAEMON_HEARTBEAT_STALE_MS,
|
|
587
|
+
DAEMON_LOCKFILE,
|
|
588
|
+
DEV_BRIDGES_DIR,
|
|
589
|
+
RNX_HOME_ENV,
|
|
590
|
+
activeRuntimeDir,
|
|
591
|
+
activeRuntimeFile,
|
|
592
|
+
cacheDir,
|
|
593
|
+
cameraFixturesDir,
|
|
594
|
+
claimDaemonLockfile,
|
|
595
|
+
cliUpdateFilePath,
|
|
596
|
+
configFilePath,
|
|
597
|
+
consumeRuntimeUpgradeNotice,
|
|
598
|
+
daemonAppBundlePath,
|
|
599
|
+
daemonAppDir,
|
|
600
|
+
daemonAppLauncherPath,
|
|
601
|
+
daemonLockfilePath,
|
|
602
|
+
devBridgeLockfilePath,
|
|
603
|
+
devBridgesDir,
|
|
604
|
+
electronDir,
|
|
605
|
+
electronUserDataDir,
|
|
606
|
+
electronVersionDir,
|
|
607
|
+
ensureRnxHome,
|
|
608
|
+
isDaemonLockfileFresh,
|
|
609
|
+
isDevBridgeLockfileFresh,
|
|
610
|
+
isDevWorkstation,
|
|
611
|
+
isOnboardingComplete,
|
|
612
|
+
isSootsimDevCheckout,
|
|
613
|
+
profilesDir,
|
|
614
|
+
readActiveRuntime,
|
|
615
|
+
readDaemonLockfile,
|
|
616
|
+
readDefaultBox,
|
|
617
|
+
readDevBridgeLockfiles,
|
|
618
|
+
readLiveRuntimeVersions,
|
|
619
|
+
readOrCreateAnonymousId,
|
|
620
|
+
readPrivacyPreferences,
|
|
621
|
+
readSharedConfig,
|
|
622
|
+
readSimulatorDriverPreference,
|
|
623
|
+
removeDaemonLockfile,
|
|
624
|
+
removeDevBridgeLockfile,
|
|
625
|
+
rnxHomeDir,
|
|
626
|
+
runtimeDir,
|
|
627
|
+
runtimeUpgradeNoticePath,
|
|
628
|
+
runtimesDir,
|
|
629
|
+
shouldSkipPersistentDaemon,
|
|
630
|
+
writeActiveRuntime,
|
|
631
|
+
writeDaemonLockfile,
|
|
632
|
+
writeDefaultBox,
|
|
633
|
+
writeDevBridgeLockfile,
|
|
634
|
+
writeOnboardingPreferences,
|
|
635
|
+
writePrivacyPreferences,
|
|
636
|
+
writeRuntimeUpgradeNotice,
|
|
637
|
+
writeSharedConfig
|
|
638
|
+
});
|