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.
Files changed (324) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +640 -0
  3. package/cli/app-config.ts +82 -0
  4. package/cli/app-fonts.ts +388 -0
  5. package/cli/app-project.ts +59 -0
  6. package/cli/app-splash.ts +171 -0
  7. package/cli/app-state-reset.ts +26 -0
  8. package/cli/auth.ts +184 -0
  9. package/cli/bin.ts +59 -0
  10. package/cli/bridge-diagnostics.ts +226 -0
  11. package/cli/bridge-flow-runner.ts +2806 -0
  12. package/cli/browser-backend.ts +44 -0
  13. package/cli/browser-evals.ts +96 -0
  14. package/cli/cli-update.ts +261 -0
  15. package/cli/cloud-client.ts +1530 -0
  16. package/cli/cloud-dispatch.ts +206 -0
  17. package/cli/cloud-session.ts +227 -0
  18. package/cli/command-contract.ts +221 -0
  19. package/cli/command-registry.ts +304 -0
  20. package/cli/commands/agent-wrapper.ts +1048 -0
  21. package/cli/commands/agent.ts +439 -0
  22. package/cli/commands/app-fonts.ts +99 -0
  23. package/cli/commands/assert.ts +542 -0
  24. package/cli/commands/auth.ts +71 -0
  25. package/cli/commands/box/bundle-plane.ts +71 -0
  26. package/cli/commands/box/checkout-plane.ts +256 -0
  27. package/cli/commands/box/plane-share.ts +208 -0
  28. package/cli/commands/box/rnx-command.ts +60 -0
  29. package/cli/commands/box/search-command.ts +157 -0
  30. package/cli/commands/box.ts +925 -0
  31. package/cli/commands/camera.ts +266 -0
  32. package/cli/commands/cleanup.ts +169 -0
  33. package/cli/commands/compat.ts +176 -0
  34. package/cli/commands/config.ts +34 -0
  35. package/cli/commands/control.ts +2154 -0
  36. package/cli/commands/cpu-profile.ts +941 -0
  37. package/cli/commands/daemon-mac-app.ts +165 -0
  38. package/cli/commands/daemon.ts +800 -0
  39. package/cli/commands/debug.ts +751 -0
  40. package/cli/commands/desktop.ts +39 -0
  41. package/cli/commands/detect.ts +201 -0
  42. package/cli/commands/detox.ts +481 -0
  43. package/cli/commands/device.ts +134 -0
  44. package/cli/commands/diagnose.ts +589 -0
  45. package/cli/commands/do-chain.ts +408 -0
  46. package/cli/commands/electron.ts +94 -0
  47. package/cli/commands/film.ts +379 -0
  48. package/cli/commands/flow.ts +1240 -0
  49. package/cli/commands/inspect/actions.ts +516 -0
  50. package/cli/commands/inspect/core.ts +2086 -0
  51. package/cli/commands/inspect/count.ts +17 -0
  52. package/cli/commands/inspect/describe.ts +119 -0
  53. package/cli/commands/inspect/env.ts +25 -0
  54. package/cli/commands/inspect/find.ts +169 -0
  55. package/cli/commands/inspect/get-layout.ts +53 -0
  56. package/cli/commands/inspect/keyboard.ts +54 -0
  57. package/cli/commands/inspect/list.ts +175 -0
  58. package/cli/commands/inspect/memory.ts +215 -0
  59. package/cli/commands/inspect/redaction.ts +39 -0
  60. package/cli/commands/inspect/resolve-target.ts +77 -0
  61. package/cli/commands/inspect/screens.ts +78 -0
  62. package/cli/commands/inspect/settle.ts +32 -0
  63. package/cli/commands/inspect/settling.ts +197 -0
  64. package/cli/commands/inspect/shared.ts +259 -0
  65. package/cli/commands/inspect/sleep.ts +15 -0
  66. package/cli/commands/inspect/tree.ts +23 -0
  67. package/cli/commands/inspect/url.ts +17 -0
  68. package/cli/commands/inspect/wait-event.ts +211 -0
  69. package/cli/commands/inspect/wait-idle.ts +25 -0
  70. package/cli/commands/inspect/wait-ready.ts +87 -0
  71. package/cli/commands/inspect/wait-selector.ts +59 -0
  72. package/cli/commands/inspect/wait.ts +32 -0
  73. package/cli/commands/inspect.ts +4738 -0
  74. package/cli/commands/install-cli.ts +275 -0
  75. package/cli/commands/install-desktop.ts +385 -0
  76. package/cli/commands/login.ts +357 -0
  77. package/cli/commands/logout.ts +24 -0
  78. package/cli/commands/maestro-generate.ts +375 -0
  79. package/cli/commands/maestro.ts +536 -0
  80. package/cli/commands/mode.ts +58 -0
  81. package/cli/commands/no-bridge-hint.ts +80 -0
  82. package/cli/commands/perf.ts +67 -0
  83. package/cli/commands/permissions.ts +203 -0
  84. package/cli/commands/platform.ts +410 -0
  85. package/cli/commands/preview.ts +103 -0
  86. package/cli/commands/profile.ts +106 -0
  87. package/cli/commands/react.ts +353 -0
  88. package/cli/commands/record.ts +1435 -0
  89. package/cli/commands/report-issue.ts +305 -0
  90. package/cli/commands/reset.ts +89 -0
  91. package/cli/commands/runtime.ts +348 -0
  92. package/cli/commands/screenshot-command.ts +106 -0
  93. package/cli/commands/screenshot-layers.ts +144 -0
  94. package/cli/commands/screenshot-mode.ts +38 -0
  95. package/cli/commands/screenshot.ts +492 -0
  96. package/cli/commands/screenshots-capture.ts +608 -0
  97. package/cli/commands/screenshots.ts +127 -0
  98. package/cli/commands/serve.ts +139 -0
  99. package/cli/commands/setup.ts +416 -0
  100. package/cli/commands/shell-boolean-mode.ts +82 -0
  101. package/cli/commands/skills.ts +468 -0
  102. package/cli/commands/slides.ts +357 -0
  103. package/cli/commands/state.ts +94 -0
  104. package/cli/commands/storage.ts +58 -0
  105. package/cli/commands/telemetry.ts +55 -0
  106. package/cli/commands/test.ts +535 -0
  107. package/cli/commands/three-mode.ts +771 -0
  108. package/cli/commands/timeline.ts +121 -0
  109. package/cli/commands/upgrade.ts +167 -0
  110. package/cli/commands/upload.ts +1203 -0
  111. package/cli/commands/version.ts +63 -0
  112. package/cli/commands/welcome.ts +17 -0
  113. package/cli/commands/what-happened.ts +328 -0
  114. package/cli/current-sim.ts +217 -0
  115. package/cli/desktop-companion.ts +315 -0
  116. package/cli/drivers/electron.ts +70 -0
  117. package/cli/drivers/index.ts +20 -0
  118. package/cli/drivers/playwright-provisioning.ts +184 -0
  119. package/cli/drivers/playwright-sim-host.ts +537 -0
  120. package/cli/drivers/playwright.ts +209 -0
  121. package/cli/drivers/registry.ts +65 -0
  122. package/cli/drivers/types.ts +102 -0
  123. package/cli/flow-export.ts +55 -0
  124. package/cli/flow-file.ts +142 -0
  125. package/cli/flow-live-status.ts +126 -0
  126. package/cli/flow-session.ts +140 -0
  127. package/cli/help-core.ts +143 -0
  128. package/cli/help.ts +44 -0
  129. package/cli/hidden-runtime-alias.ts +19 -0
  130. package/cli/hints.ts +214 -0
  131. package/cli/inspect-notice-state.ts +114 -0
  132. package/cli/internal-child.ts +176 -0
  133. package/cli/maestro-js.ts +323 -0
  134. package/cli/main.ts +704 -0
  135. package/cli/open-url.ts +8 -0
  136. package/cli/outbound-endpoints.ts +830 -0
  137. package/cli/parent-pid.ts +204 -0
  138. package/cli/parse-args.ts +189 -0
  139. package/cli/privacy.ts +53 -0
  140. package/cli/prompt.ts +56 -0
  141. package/cli/recording-access.ts +108 -0
  142. package/cli/registry.ts +2 -0
  143. package/cli/resolve-assets.ts +63 -0
  144. package/cli/rnx-in-process.ts +98 -0
  145. package/cli/run-registry.ts +226 -0
  146. package/cli/run-rnx-core.ts +148 -0
  147. package/cli/run-rnx.ts +137 -0
  148. package/cli/runtime-notes.ts +66 -0
  149. package/cli/runtime-summary.ts +25 -0
  150. package/cli/secure-file.ts +31 -0
  151. package/cli/self-invocation.ts +58 -0
  152. package/cli/send-to-box.ts +109 -0
  153. package/cli/setup-repository.ts +191 -0
  154. package/cli/shell-init.ts +98 -0
  155. package/cli/standalone.ts +4 -0
  156. package/cli/telemetry.ts +84 -0
  157. package/cli/ui.ts +68 -0
  158. package/cli/ws-bridge.ts +1020 -0
  159. package/detox/attempt-events.cjs +23 -0
  160. package/detox/colors.ts +54 -0
  161. package/detox/config-loader.ts +135 -0
  162. package/detox/element-types.ts +48 -0
  163. package/detox/expectations.ts +534 -0
  164. package/detox/gestures.ts +501 -0
  165. package/detox/index.ts +2694 -0
  166. package/detox/jest-preset.cjs +29 -0
  167. package/detox/jest-setup-after-env.cjs +22 -0
  168. package/detox/matchers.ts +30 -0
  169. package/detox/motion-change.cjs +109 -0
  170. package/detox/motion-change.d.cts +35 -0
  171. package/detox/navigation-lifecycle.ts +290 -0
  172. package/detox/navigation.ts +43 -0
  173. package/detox/proof-frame.cjs +114 -0
  174. package/detox/record-block-execution.cjs +78 -0
  175. package/detox/screenshots/animated-color-test-rest-norngh.png +0 -0
  176. package/detox/screenshots/color-test-after-drag-norngh.png +0 -0
  177. package/detox/screenshots/color-test-rest-norngh.png +0 -0
  178. package/detox/screenshots/theme-blue-toggle.png +0 -0
  179. package/detox/screenshots/theme-blue.png +0 -0
  180. package/detox/screenshots/theme-red-toggle.png +0 -0
  181. package/detox/screenshots/theme-red.png +0 -0
  182. package/dist-lib/agent-daemon-client.cjs +502 -0
  183. package/dist-lib/agent-events.cjs +48 -0
  184. package/dist-lib/agent-identity.cjs +53 -0
  185. package/dist-lib/agent-sessions.cjs +759 -0
  186. package/dist-lib/attached-projects.cjs +526 -0
  187. package/dist-lib/auth/shared-session.cjs +208 -0
  188. package/dist-lib/backend-origin.cjs +88 -0
  189. package/dist-lib/beta.cjs +41 -0
  190. package/dist-lib/beta.mjs +13 -0
  191. package/dist-lib/bridge-constants.cjs +161 -0
  192. package/dist-lib/bridge-contract-input.cjs +451 -0
  193. package/dist-lib/bridge-contract-input.mjs +414 -0
  194. package/dist-lib/bridge-contract.cjs +130 -0
  195. package/dist-lib/bridge-contract.mjs +94 -0
  196. package/dist-lib/capture-contract.cjs +220 -0
  197. package/dist-lib/capture-contract.mjs +190 -0
  198. package/dist-lib/cli-constants.cjs +32 -0
  199. package/dist-lib/cloud-contract.cjs +194 -0
  200. package/dist-lib/cloud-contract.mjs +145 -0
  201. package/dist-lib/cloud.cjs +670 -0
  202. package/dist-lib/cloud.mjs +639 -0
  203. package/dist-lib/config.cjs +96 -0
  204. package/dist-lib/detox/index.cjs +3789 -0
  205. package/dist-lib/detox/jest-preset.cjs +29 -0
  206. package/dist-lib/dev-bundle-resolution.cjs +290 -0
  207. package/dist-lib/home-paths.cjs +638 -0
  208. package/dist-lib/host/bridge-host.cjs +10903 -0
  209. package/dist-lib/host/fetch-proxy-handler.cjs +421 -0
  210. package/dist-lib/host/fetch-proxy-overrides.cjs +63 -0
  211. package/dist-lib/host/fetch-proxy-overrides.mjs +37 -0
  212. package/dist-lib/host/replacement-module-handler.cjs +469 -0
  213. package/dist-lib/host/websocket-proxy.cjs +298 -0
  214. package/dist-lib/index.cjs +4268 -0
  215. package/dist-lib/jump-to-source-babel.cjs +93 -0
  216. package/dist-lib/jump-to-source-native.cjs +112 -0
  217. package/dist-lib/menu.cjs +646 -0
  218. package/dist-lib/menu.mjs +604 -0
  219. package/dist-lib/metro-fingerprint-registry.cjs +186 -0
  220. package/dist-lib/metro-fingerprint-registry.mjs +156 -0
  221. package/dist-lib/metro-production-bundle.cjs +329 -0
  222. package/dist-lib/metro-production-bundle.mjs +295 -0
  223. package/dist-lib/metro.cjs +904 -0
  224. package/dist-lib/profiles.cjs +246 -0
  225. package/dist-lib/public-brand.cjs +39 -0
  226. package/dist-lib/react-native-host-modules.cjs +51 -0
  227. package/dist-lib/react-native-host-modules.mjs +25 -0
  228. package/dist-lib/render-mode.cjs +54 -0
  229. package/dist-lib/scripts/dev-server-scanner.cjs +1232 -0
  230. package/dist-lib/sdk.cjs +2433 -0
  231. package/dist-lib/sdk.mjs +2336 -0
  232. package/dist-lib/skills.cjs +39132 -0
  233. package/dist-lib/swift-submit.cjs +92 -0
  234. package/dist-lib/swift-submit.mjs +65 -0
  235. package/dist-lib/swift.cjs +1646 -0
  236. package/dist-lib/vite.cjs +1591 -0
  237. package/package.json +290 -0
  238. package/scripts/dev-server-scanner.ts +1291 -0
  239. package/scripts/optional-demo-registry.ts +113 -0
  240. package/skills/contrast/SKILL.md +165 -0
  241. package/skills/rnx-debug/SKILL.md +433 -0
  242. package/skills/rnx-perf/SKILL.md +399 -0
  243. package/skills/rnx-setup/SKILL.md +172 -0
  244. package/skills/rnx-test/SKILL.md +321 -0
  245. package/skills/rnx-visual/SKILL.md +126 -0
  246. package/src/agent-daemon-client.ts +410 -0
  247. package/src/agent-events.ts +71 -0
  248. package/src/agent-identity.ts +23 -0
  249. package/src/agent-prompt.ts +71 -0
  250. package/src/agent-sessions.ts +580 -0
  251. package/src/app-url.ts +39 -0
  252. package/src/attached-projects.ts +539 -0
  253. package/src/auth/shared-session.ts +235 -0
  254. package/src/backend-origin.ts +70 -0
  255. package/src/beta.ts +19 -0
  256. package/src/bridge-constants.ts +175 -0
  257. package/src/bridge-contract-input.ts +502 -0
  258. package/src/bridge-contract.ts +558 -0
  259. package/src/browser-cache.ts +16 -0
  260. package/src/capture-contract.ts +587 -0
  261. package/src/cli-constants.ts +1 -0
  262. package/src/cli-version.ts +40 -0
  263. package/src/cloud-contract.ts +274 -0
  264. package/src/cloud.ts +762 -0
  265. package/src/codex-client.ts +234 -0
  266. package/src/config.ts +132 -0
  267. package/src/connect.ts +101 -0
  268. package/src/dev-bundle-resolution.ts +346 -0
  269. package/src/dev-server-open.ts +198 -0
  270. package/src/disk-cleanup.ts +540 -0
  271. package/src/flow-timeout-scale.ts +15 -0
  272. package/src/home-paths.ts +806 -0
  273. package/src/host/agent-host.ts +666 -0
  274. package/src/host/bridge-host.ts +2788 -0
  275. package/src/host/fetch-proxy-handler.ts +449 -0
  276. package/src/host/fetch-proxy-overrides.ts +51 -0
  277. package/src/host/open-url.ts +89 -0
  278. package/src/host/plane-host.ts +203 -0
  279. package/src/host/replacement-module-handler.ts +158 -0
  280. package/src/host/websocket-proxy.ts +315 -0
  281. package/src/index.ts +71 -0
  282. package/src/jump-to-source-babel.ts +135 -0
  283. package/src/jump-to-source-native.ts +102 -0
  284. package/src/menu.ts +777 -0
  285. package/src/metro-fingerprint-registry.ts +302 -0
  286. package/src/metro-plugin.ts +341 -0
  287. package/src/metro-production-bundle.ts +471 -0
  288. package/src/native-dev-bundle-url.ts +118 -0
  289. package/src/native-seam-manifest.ts +341 -0
  290. package/src/playwright-host-log.ts +16 -0
  291. package/src/plist.ts +27 -0
  292. package/src/poll-until.ts +123 -0
  293. package/src/profiles.ts +179 -0
  294. package/src/public-brand.ts +9 -0
  295. package/src/react-native-host-modules.ts +26 -0
  296. package/src/render-mode.ts +27 -0
  297. package/src/rolldown-plugin-swift.ts +240 -0
  298. package/src/runtime-assets.ts +233 -0
  299. package/src/runtime-delivery.ts +54 -0
  300. package/src/screenshots/compose.ts +422 -0
  301. package/src/screenshots/frame-compose.ts +514 -0
  302. package/src/screenshots/orchestrate.ts +256 -0
  303. package/src/screenshots/org-deck.ts +91 -0
  304. package/src/screenshots/registry.ts +58 -0
  305. package/src/screenshots/schema.ts +364 -0
  306. package/src/sdk.ts +15 -0
  307. package/src/settings-bundle.ts +418 -0
  308. package/src/shell-bridge-identity.ts +15 -0
  309. package/src/sim-client.ts +697 -0
  310. package/src/skills/builtin/a11y-review.ts +132 -0
  311. package/src/skills/builtin/compat-check.ts +71 -0
  312. package/src/skills/builtin/maestro-test.ts +121 -0
  313. package/src/skills/builtin/perf-profile.ts +90 -0
  314. package/src/skills/builtin/screenshot-all.ts +52 -0
  315. package/src/skills/builtin/visual-diff.ts +100 -0
  316. package/src/skills/registry.ts +107 -0
  317. package/src/skills/types.ts +41 -0
  318. package/src/swift-submit.ts +185 -0
  319. package/src/swift.ts +7 -0
  320. package/src/team-machine-prompt.ts +73 -0
  321. package/src/vite-plugin-one.ts +264 -0
  322. package/src/vite-plugin-swift.ts +620 -0
  323. package/src/vite-plugin.ts +1946 -0
  324. package/src/worklets-babel.ts +250 -0
@@ -0,0 +1,298 @@
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 __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/host/websocket-proxy.ts
23
+ var websocket_proxy_exports = {};
24
+ __export(websocket_proxy_exports, {
25
+ WEBSOCKET_PROXY_HANDSHAKE_TIMEOUT_MS: () => WEBSOCKET_PROXY_HANDSHAKE_TIMEOUT_MS,
26
+ WEBSOCKET_PROXY_PATH: () => WEBSOCKET_PROXY_PATH,
27
+ handleWebSocketProxyUpgrade: () => handleWebSocketProxyUpgrade,
28
+ isWebSocketProxyRequestUrl: () => isWebSocketProxyRequestUrl
29
+ });
30
+ module.exports = __toCommonJS(websocket_proxy_exports);
31
+ var import_crypto = require("crypto");
32
+ var import_http = require("http");
33
+ var import_https = require("https");
34
+ var WEBSOCKET_PROXY_PATH = "/__websocket-proxy";
35
+ var WEBSOCKET_PROXY_HANDSHAKE_TIMEOUT_MS = 1e4;
36
+ var WEBSOCKET_PROTOCOL_TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
37
+ var WEBSOCKET_KEY = /^[+/0-9A-Za-z]{22}==$/;
38
+ var STRIP_UPSTREAM_HEADERS = /* @__PURE__ */ new Set([
39
+ "host",
40
+ "connection",
41
+ "upgrade",
42
+ "transfer-encoding",
43
+ "content-length",
44
+ "sec-websocket-accept",
45
+ "sec-websocket-extensions",
46
+ "sec-websocket-key",
47
+ "sec-websocket-protocol",
48
+ "sec-websocket-version"
49
+ ]);
50
+ function rejectUpgrade(socket, status, message, headers = {}) {
51
+ try {
52
+ const extraHeaders = Object.entries(headers).map(([name, value]) => `${name}: ${value}\r
53
+ `).join("");
54
+ socket.write(
55
+ `HTTP/1.1 ${status} ${message}\r
56
+ Connection: close\r
57
+ Content-Type: text/plain\r
58
+ Content-Length: ${message.length}\r
59
+ ${extraHeaders}\r
60
+ ${message}`
61
+ );
62
+ } catch {
63
+ }
64
+ socket.destroy();
65
+ }
66
+ function hasHeaderToken(value, token) {
67
+ return (value || "").split(",").some((part) => part.trim().toLowerCase() === token);
68
+ }
69
+ function hasValidProtocolOffer(value) {
70
+ if (value === void 0) return true;
71
+ if (!WEBSOCKET_PROTOCOL_TOKEN.test(value[0] || "")) return false;
72
+ if (!WEBSOCKET_PROTOCOL_TOKEN.test(value[value.length - 1] || "")) return false;
73
+ const protocols = /* @__PURE__ */ new Set();
74
+ for (const part of value.split(",")) {
75
+ const protocol = part.trim();
76
+ if (!WEBSOCKET_PROTOCOL_TOKEN.test(protocol) || protocols.has(protocol)) {
77
+ return false;
78
+ }
79
+ protocols.add(protocol);
80
+ }
81
+ return true;
82
+ }
83
+ function validateUpgradeRequest(req) {
84
+ if (req.method !== "GET") {
85
+ return { status: 405, message: "invalid websocket http method" };
86
+ }
87
+ if (!hasHeaderToken(req.headers.connection, "upgrade") || !hasHeaderToken(req.headers.upgrade, "websocket")) {
88
+ return { status: 400, message: "invalid websocket upgrade headers" };
89
+ }
90
+ const key = req.headers["sec-websocket-key"];
91
+ if (typeof key !== "string" || !WEBSOCKET_KEY.test(key) || Buffer.from(key, "base64").byteLength !== 16 || Buffer.from(key, "base64").toString("base64") !== key) {
92
+ return { status: 400, message: "invalid websocket key" };
93
+ }
94
+ if (req.headers["sec-websocket-version"] !== "13") {
95
+ return {
96
+ status: 400,
97
+ message: "invalid websocket version",
98
+ headers: { "Sec-WebSocket-Version": "13" }
99
+ };
100
+ }
101
+ if (!hasValidProtocolOffer(req.headers["sec-websocket-protocol"])) {
102
+ return { status: 400, message: "invalid websocket protocol offer" };
103
+ }
104
+ return null;
105
+ }
106
+ function isSameOriginUpgrade(req) {
107
+ const origin = req.headers.origin;
108
+ const host = req.headers.host;
109
+ if (!origin || !host) return false;
110
+ try {
111
+ return new URL(origin).host === host;
112
+ } catch {
113
+ return false;
114
+ }
115
+ }
116
+ function decodeProxyHeaders(encoded) {
117
+ if (!encoded) return {};
118
+ const base64 = encoded.replace(/-/g, "+").replace(/_/g, "/");
119
+ const padded = base64 + "=".repeat((4 - base64.length % 4) % 4);
120
+ const parsed = JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
121
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
122
+ const headers = {};
123
+ for (const [key, value] of Object.entries(parsed)) {
124
+ if (value == null) continue;
125
+ if (STRIP_UPSTREAM_HEADERS.has(key.toLowerCase())) continue;
126
+ headers[key] = Array.isArray(value) ? value.join(", ") : String(value);
127
+ }
128
+ return headers;
129
+ }
130
+ function getDefaultWebSocketOrigin(targetUrl) {
131
+ const origin = new URL(targetUrl.href);
132
+ origin.protocol = targetUrl.protocol === "wss:" ? "https:" : "http:";
133
+ return origin.origin;
134
+ }
135
+ function createUpstreamHeaders(req, targetUrl, headers, forwardOrigin) {
136
+ const upstreamHeaders = { ...headers };
137
+ const originKeys = Object.keys(upstreamHeaders).filter(
138
+ (key2) => key2.toLowerCase() === "origin"
139
+ );
140
+ if (forwardOrigin && originKeys.length === 0) {
141
+ upstreamHeaders.origin = getDefaultWebSocketOrigin(targetUrl);
142
+ } else if (!forwardOrigin) {
143
+ for (const key2 of originKeys) delete upstreamHeaders[key2];
144
+ }
145
+ upstreamHeaders.connection = "Upgrade";
146
+ upstreamHeaders.upgrade = "websocket";
147
+ const key = req.headers["sec-websocket-key"];
148
+ if (typeof key === "string") upstreamHeaders["sec-websocket-key"] = key;
149
+ const version = req.headers["sec-websocket-version"];
150
+ if (typeof version === "string") upstreamHeaders["sec-websocket-version"] = version;
151
+ const protocol = req.headers["sec-websocket-protocol"];
152
+ if (typeof protocol === "string") upstreamHeaders["sec-websocket-protocol"] = protocol;
153
+ const extensions = req.headers["sec-websocket-extensions"];
154
+ if (typeof extensions === "string") {
155
+ upstreamHeaders["sec-websocket-extensions"] = extensions;
156
+ }
157
+ return upstreamHeaders;
158
+ }
159
+ function isWebSocketProxyRequestUrl(rawUrl) {
160
+ if (!rawUrl) return false;
161
+ try {
162
+ return new URL(rawUrl, "http://localhost").pathname === WEBSOCKET_PROXY_PATH;
163
+ } catch {
164
+ return false;
165
+ }
166
+ }
167
+ function handleWebSocketProxyUpgrade(req, socket, head, forwardOrigin = true) {
168
+ if (!isWebSocketProxyRequestUrl(req.url)) return false;
169
+ if (!isSameOriginUpgrade(req)) {
170
+ rejectUpgrade(socket, 403, "forbidden websocket proxy origin");
171
+ return true;
172
+ }
173
+ const upgradeRejection = validateUpgradeRequest(req);
174
+ if (upgradeRejection) {
175
+ rejectUpgrade(
176
+ socket,
177
+ upgradeRejection.status,
178
+ upgradeRejection.message,
179
+ upgradeRejection.headers
180
+ );
181
+ return true;
182
+ }
183
+ let targetUrl;
184
+ let headers;
185
+ try {
186
+ const requestUrl = new URL(req.url || "/", "http://localhost");
187
+ const target = requestUrl.searchParams.get("url");
188
+ if (!target) {
189
+ rejectUpgrade(socket, 400, "missing websocket proxy url");
190
+ return true;
191
+ }
192
+ targetUrl = new URL(target);
193
+ if (targetUrl.protocol !== "ws:" && targetUrl.protocol !== "wss:") {
194
+ rejectUpgrade(socket, 400, "invalid websocket proxy protocol");
195
+ return true;
196
+ }
197
+ headers = decodeProxyHeaders(requestUrl.searchParams.get("headers"));
198
+ } catch {
199
+ rejectUpgrade(socket, 400, "invalid websocket proxy request");
200
+ return true;
201
+ }
202
+ const upstreamHeaders = createUpstreamHeaders(req, targetUrl, headers, forwardOrigin);
203
+ let settled = false;
204
+ const request = targetUrl.protocol === "wss:" ? import_https.request : import_http.request;
205
+ const upstreamRequestUrl = new URL(targetUrl);
206
+ upstreamRequestUrl.protocol = targetUrl.protocol === "wss:" ? "https:" : "http:";
207
+ const upstreamRequest = request(upstreamRequestUrl, {
208
+ method: "GET",
209
+ headers: upstreamHeaders
210
+ });
211
+ let destroyUpstreamSocket = () => {
212
+ };
213
+ upstreamRequest.once("socket", (upstreamSocket) => {
214
+ destroyUpstreamSocket = () => upstreamSocket.destroy();
215
+ });
216
+ const fail = (status, message) => {
217
+ if (settled) return;
218
+ settled = true;
219
+ clearTimeout(timer);
220
+ upstreamRequest.destroy();
221
+ destroyUpstreamSocket();
222
+ rejectUpgrade(socket, status, message);
223
+ };
224
+ const timer = setTimeout(() => {
225
+ fail(504, "upstream websocket handshake timeout");
226
+ }, WEBSOCKET_PROXY_HANDSHAKE_TIMEOUT_MS);
227
+ socket.once("close", () => {
228
+ if (!settled) {
229
+ settled = true;
230
+ clearTimeout(timer);
231
+ }
232
+ upstreamRequest.destroy();
233
+ destroyUpstreamSocket();
234
+ });
235
+ upstreamRequest.once("response", (response) => {
236
+ response.resume();
237
+ fail(502, "upstream websocket rejected upgrade");
238
+ });
239
+ upstreamRequest.once("error", () => {
240
+ fail(502, "upstream websocket error");
241
+ });
242
+ upstreamRequest.once("upgrade", (response, upstreamSocket, upstreamHead) => {
243
+ if (settled) {
244
+ upstreamSocket.destroy();
245
+ return;
246
+ }
247
+ const accept = response.headers["sec-websocket-accept"];
248
+ const upgrade = response.headers.upgrade;
249
+ const requestKey = req.headers["sec-websocket-key"];
250
+ const expectedAccept = typeof requestKey === "string" ? (0, import_crypto.createHash)("sha1").update(`${requestKey}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`).digest("base64") : "";
251
+ if (typeof accept !== "string" || accept !== expectedAccept || typeof upgrade !== "string" || upgrade.toLowerCase() !== "websocket") {
252
+ upstreamSocket.destroy();
253
+ fail(502, "upstream websocket handshake is invalid");
254
+ return;
255
+ }
256
+ const selectedProtocol = response.headers["sec-websocket-protocol"];
257
+ const requestedProtocols = (req.headers["sec-websocket-protocol"] || "").split(",").map((protocol) => protocol.trim());
258
+ if (typeof selectedProtocol === "string" && !requestedProtocols.includes(selectedProtocol)) {
259
+ upstreamSocket.destroy();
260
+ fail(502, "upstream websocket selected an unrequested protocol");
261
+ return;
262
+ }
263
+ settled = true;
264
+ clearTimeout(timer);
265
+ const responseHeaders = [
266
+ "HTTP/1.1 101 Switching Protocols",
267
+ "Upgrade: websocket",
268
+ "Connection: Upgrade",
269
+ `Sec-WebSocket-Accept: ${accept}`
270
+ ];
271
+ if (typeof selectedProtocol === "string") {
272
+ responseHeaders.push(`Sec-WebSocket-Protocol: ${selectedProtocol}`);
273
+ }
274
+ const selectedExtensions = response.headers["sec-websocket-extensions"];
275
+ if (typeof selectedExtensions === "string") {
276
+ responseHeaders.push(`Sec-WebSocket-Extensions: ${selectedExtensions}`);
277
+ }
278
+ socket.write(`${responseHeaders.join("\r\n")}\r
279
+ \r
280
+ `);
281
+ if (head.length > 0) upstreamSocket.write(head);
282
+ if (upstreamHead.length > 0) socket.write(upstreamHead);
283
+ socket.once("close", () => upstreamSocket.destroy());
284
+ socket.once("error", () => upstreamSocket.destroy());
285
+ upstreamSocket.once("error", () => socket.destroy());
286
+ socket.pipe(upstreamSocket);
287
+ upstreamSocket.pipe(socket);
288
+ });
289
+ upstreamRequest.end();
290
+ return true;
291
+ }
292
+ // Annotate the CommonJS export names for ESM import in node:
293
+ 0 && (module.exports = {
294
+ WEBSOCKET_PROXY_HANDSHAKE_TIMEOUT_MS,
295
+ WEBSOCKET_PROXY_PATH,
296
+ handleWebSocketProxyUpgrade,
297
+ isWebSocketProxyRequestUrl
298
+ });