@buoy-gg/external-sync 7.0.0 → 7.0.1

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.
@@ -85,7 +85,10 @@ function useExternalSyncSocket({
85
85
  // outage to avoid flooding the console until the server comes back up.
86
86
  if (hasLoggedConnectError.current) return;
87
87
  hasLoggedConnectError.current = true;
88
- (0, _logger.log)(`[buoy] desktop sync: can't reach ${currentSocketURL} (is Buoy Desktop running?). ` + `Retrying in the background. If it's running on another machine or port, ` + `pass socketURL via the externalSync prop. (${error.message})`, enableLogs, "warn");
88
+ // A localhost target on an Android device means a USB (adb reverse)
89
+ // setup — name the exact command instead of the generic hint.
90
+ const hint = platform === "android" && /localhost|127\.0\.0\.1/.test(currentSocketURL) ? `If this device is connected over USB, run: adb reverse tcp:42831 tcp:42831. ` : `If it's running on another machine or port, pass socketURL via the externalSync prop. `;
91
+ (0, _logger.log)(`[buoy] desktop sync: can't reach ${currentSocketURL} (is Buoy Desktop running?). ` + `Retrying in the background. ${hint}(${error.message})`, enableLogs, "warn");
89
92
  };
90
93
  const onConnectTimeout = () => {
91
94
  (0, _logger.log)(`${logPrefix} Socket connection timeout`, enableLogs, "error");
@@ -4,14 +4,40 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getPlatformSpecificURL = void 0;
7
+ /**
8
+ * True only on an actual Android EMULATOR, detected via the build fingerprint
9
+ * (same heuristic react-native-device-info uses), with no native dependency.
10
+ * Physical devices must NOT get the 10.0.2.2 rewrite: over USB (`adb reverse`)
11
+ * the Metro-derived host is "localhost", and rewriting it to the
12
+ * emulator-only 10.0.2.2 alias breaks the connection — keeping localhost lets
13
+ * `adb reverse tcp:42831 tcp:42831` forward it to the dev machine.
14
+ *
15
+ * The react-native require stays lexically inside try{} (Metro optional-dep
16
+ * rule) and this module is never imported from types.ts, so non-Metro
17
+ * bundles (the desktop app) are unaffected.
18
+ */
19
+ const isAndroidEmulator = () => {
20
+ try {
21
+ const {
22
+ Platform
23
+ } = require("react-native");
24
+ if (Platform.OS !== "android") return false;
25
+ const fingerprint = Platform.constants?.Fingerprint ?? "";
26
+ return /generic|emulator|goldfish|ranchu|sdk_gphone|vbox/i.test(fingerprint);
27
+ } catch {
28
+ return false;
29
+ }
30
+ };
31
+
7
32
  /**
8
33
  * Get platform-specific URL for socket connection.
9
- * On Android emulator, replaces localhost with 10.0.2.2.
34
+ * On the Android emulator (only), replaces localhost with 10.0.2.2 —
35
+ * the emulator's alias for the host machine's loopback.
10
36
  */
11
37
  const getPlatformSpecificURL = (baseUrl, platform) => {
12
38
  try {
13
39
  const url = new URL(baseUrl);
14
- if (platform === "android" && (url.hostname === "localhost" || url.hostname === "127.0.0.1")) {
40
+ if (platform === "android" && (url.hostname === "localhost" || url.hostname === "127.0.0.1") && isAndroidEmulator()) {
15
41
  url.hostname = "10.0.2.2";
16
42
  return url.toString();
17
43
  }
@@ -81,7 +81,10 @@ export function useExternalSyncSocket({
81
81
  // outage to avoid flooding the console until the server comes back up.
82
82
  if (hasLoggedConnectError.current) return;
83
83
  hasLoggedConnectError.current = true;
84
- log(`[buoy] desktop sync: can't reach ${currentSocketURL} (is Buoy Desktop running?). ` + `Retrying in the background. If it's running on another machine or port, ` + `pass socketURL via the externalSync prop. (${error.message})`, enableLogs, "warn");
84
+ // A localhost target on an Android device means a USB (adb reverse)
85
+ // setup — name the exact command instead of the generic hint.
86
+ const hint = platform === "android" && /localhost|127\.0\.0\.1/.test(currentSocketURL) ? `If this device is connected over USB, run: adb reverse tcp:42831 tcp:42831. ` : `If it's running on another machine or port, pass socketURL via the externalSync prop. `;
87
+ log(`[buoy] desktop sync: can't reach ${currentSocketURL} (is Buoy Desktop running?). ` + `Retrying in the background. ${hint}(${error.message})`, enableLogs, "warn");
85
88
  };
86
89
  const onConnectTimeout = () => {
87
90
  log(`${logPrefix} Socket connection timeout`, enableLogs, "error");
@@ -1,13 +1,39 @@
1
1
  "use strict";
2
2
 
3
+ /**
4
+ * True only on an actual Android EMULATOR, detected via the build fingerprint
5
+ * (same heuristic react-native-device-info uses), with no native dependency.
6
+ * Physical devices must NOT get the 10.0.2.2 rewrite: over USB (`adb reverse`)
7
+ * the Metro-derived host is "localhost", and rewriting it to the
8
+ * emulator-only 10.0.2.2 alias breaks the connection — keeping localhost lets
9
+ * `adb reverse tcp:42831 tcp:42831` forward it to the dev machine.
10
+ *
11
+ * The react-native require stays lexically inside try{} (Metro optional-dep
12
+ * rule) and this module is never imported from types.ts, so non-Metro
13
+ * bundles (the desktop app) are unaffected.
14
+ */
15
+ const isAndroidEmulator = () => {
16
+ try {
17
+ const {
18
+ Platform
19
+ } = require("react-native");
20
+ if (Platform.OS !== "android") return false;
21
+ const fingerprint = Platform.constants?.Fingerprint ?? "";
22
+ return /generic|emulator|goldfish|ranchu|sdk_gphone|vbox/i.test(fingerprint);
23
+ } catch {
24
+ return false;
25
+ }
26
+ };
27
+
3
28
  /**
4
29
  * Get platform-specific URL for socket connection.
5
- * On Android emulator, replaces localhost with 10.0.2.2.
30
+ * On the Android emulator (only), replaces localhost with 10.0.2.2 —
31
+ * the emulator's alias for the host machine's loopback.
6
32
  */
7
33
  export const getPlatformSpecificURL = (baseUrl, platform) => {
8
34
  try {
9
35
  const url = new URL(baseUrl);
10
- if (platform === "android" && (url.hostname === "localhost" || url.hostname === "127.0.0.1")) {
36
+ if (platform === "android" && (url.hostname === "localhost" || url.hostname === "127.0.0.1") && isAndroidEmulator()) {
11
37
  url.hostname = "10.0.2.2";
12
38
  return url.toString();
13
39
  }
@@ -106,8 +106,9 @@ export interface UseExternalSyncSocketProps {
106
106
  /**
107
107
  * Broker URL to dial. @default derived from Metro's scriptURL host
108
108
  * (the machine that served the bundle — Buoy Desktop's machine) on port
109
- * 42831, so physical devices work zero-config. Pass explicitly for
110
- * tunnels, adb-reverse USB setups, or a broker on another machine.
109
+ * 42831, so physical devices work zero-config (Android over USB: run
110
+ * `adb reverse tcp:42831 tcp:42831`). Pass explicitly for tunnels or a
111
+ * broker on another machine.
111
112
  */
112
113
  socketURL?: string;
113
114
  persistentDeviceId: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useExternalSyncSocket.d.ts","sourceRoot":"","sources":["../../src/useExternalSyncSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM1D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AA0B1D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,UAAkB,GACnB,EAAE,0BAA0B;;;;;EAuO5B"}
1
+ {"version":3,"file":"useExternalSyncSocket.d.ts","sourceRoot":"","sources":["../../src/useExternalSyncSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM1D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AA0B1D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,UAAkB,GACnB,EAAE,0BAA0B;;;;;EA4O5B"}
@@ -1,7 +1,8 @@
1
1
  import type { PlatformOS } from "../types";
2
2
  /**
3
3
  * Get platform-specific URL for socket connection.
4
- * On Android emulator, replaces localhost with 10.0.2.2.
4
+ * On the Android emulator (only), replaces localhost with 10.0.2.2 —
5
+ * the emulator's alias for the host machine's loopback.
5
6
  */
6
7
  export declare const getPlatformSpecificURL: (baseUrl: string, platform: PlatformOS) => string;
7
8
  //# sourceMappingURL=platformUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"platformUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/platformUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,MAAM,EACf,UAAU,UAAU,KACnB,MAiBF,CAAC"}
1
+ {"version":3,"file":"platformUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/platformUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA4B3C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,MAAM,EACf,UAAU,UAAU,KACnB,MAkBF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/external-sync",
3
- "version": "7.0.0",
3
+ "version": "7.0.1",
4
4
  "description": "Generic device-to-desktop sync for Buoy dev tools",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",