react-native-debug-toolkit 3.2.1 → 3.2.2

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 (66) hide show
  1. package/README.md +13 -2
  2. package/README.zh-CN.md +13 -2
  3. package/android/build.gradle +34 -0
  4. package/android/src/main/AndroidManifest.xml +1 -0
  5. package/android/src/main/java/com/reactnativedebugtoolkit/DebugToolkitDevConnectModule.java +70 -0
  6. package/android/src/main/java/com/reactnativedebugtoolkit/ReactNativeDebugToolkitPackage.java +25 -0
  7. package/ios/DebugToolkitDevConnect.mm +67 -0
  8. package/lib/commonjs/features/devConnect/DevConnectQrScanner.js +18 -7
  9. package/lib/commonjs/features/devConnect/DevConnectQrScanner.js.map +1 -1
  10. package/lib/commonjs/features/devConnect/DevConnectTab.js +232 -161
  11. package/lib/commonjs/features/devConnect/DevConnectTab.js.map +1 -1
  12. package/lib/commonjs/features/devConnect/devConnectPreferences.js +35 -5
  13. package/lib/commonjs/features/devConnect/devConnectPreferences.js.map +1 -1
  14. package/lib/commonjs/features/devConnect/devConnectUtils.js +99 -15
  15. package/lib/commonjs/features/devConnect/devConnectUtils.js.map +1 -1
  16. package/lib/commonjs/features/devConnect/index.js +39 -2
  17. package/lib/commonjs/features/devConnect/index.js.map +1 -1
  18. package/lib/commonjs/features/devConnect/nativeDevConnect.js +110 -0
  19. package/lib/commonjs/features/devConnect/nativeDevConnect.js.map +1 -0
  20. package/lib/commonjs/features/devConnect/platformDetect.js +7 -11
  21. package/lib/commonjs/features/devConnect/platformDetect.js.map +1 -1
  22. package/lib/commonjs/utils/debugPreferences.js +43 -6
  23. package/lib/commonjs/utils/debugPreferences.js.map +1 -1
  24. package/lib/module/features/devConnect/DevConnectQrScanner.js +18 -7
  25. package/lib/module/features/devConnect/DevConnectQrScanner.js.map +1 -1
  26. package/lib/module/features/devConnect/DevConnectTab.js +235 -164
  27. package/lib/module/features/devConnect/DevConnectTab.js.map +1 -1
  28. package/lib/module/features/devConnect/devConnectPreferences.js +33 -6
  29. package/lib/module/features/devConnect/devConnectPreferences.js.map +1 -1
  30. package/lib/module/features/devConnect/devConnectUtils.js +94 -15
  31. package/lib/module/features/devConnect/devConnectUtils.js.map +1 -1
  32. package/lib/module/features/devConnect/index.js +11 -3
  33. package/lib/module/features/devConnect/index.js.map +1 -1
  34. package/lib/module/features/devConnect/nativeDevConnect.js +104 -0
  35. package/lib/module/features/devConnect/nativeDevConnect.js.map +1 -0
  36. package/lib/module/features/devConnect/platformDetect.js +8 -12
  37. package/lib/module/features/devConnect/platformDetect.js.map +1 -1
  38. package/lib/module/utils/debugPreferences.js +43 -6
  39. package/lib/module/utils/debugPreferences.js.map +1 -1
  40. package/lib/typescript/src/features/devConnect/DevConnectQrScanner.d.ts +3 -2
  41. package/lib/typescript/src/features/devConnect/DevConnectQrScanner.d.ts.map +1 -1
  42. package/lib/typescript/src/features/devConnect/DevConnectTab.d.ts.map +1 -1
  43. package/lib/typescript/src/features/devConnect/devConnectPreferences.d.ts +6 -0
  44. package/lib/typescript/src/features/devConnect/devConnectPreferences.d.ts.map +1 -1
  45. package/lib/typescript/src/features/devConnect/devConnectUtils.d.ts +18 -1
  46. package/lib/typescript/src/features/devConnect/devConnectUtils.d.ts.map +1 -1
  47. package/lib/typescript/src/features/devConnect/index.d.ts +2 -2
  48. package/lib/typescript/src/features/devConnect/index.d.ts.map +1 -1
  49. package/lib/typescript/src/features/devConnect/nativeDevConnect.d.ts +17 -0
  50. package/lib/typescript/src/features/devConnect/nativeDevConnect.d.ts.map +1 -0
  51. package/lib/typescript/src/features/devConnect/platformDetect.d.ts.map +1 -1
  52. package/lib/typescript/src/features/devConnect/types.d.ts +3 -0
  53. package/lib/typescript/src/features/devConnect/types.d.ts.map +1 -1
  54. package/lib/typescript/src/utils/debugPreferences.d.ts +2 -0
  55. package/lib/typescript/src/utils/debugPreferences.d.ts.map +1 -1
  56. package/package.json +4 -1
  57. package/react-native-debug-toolkit.podspec +18 -0
  58. package/src/features/devConnect/DevConnectQrScanner.tsx +20 -9
  59. package/src/features/devConnect/DevConnectTab.tsx +227 -105
  60. package/src/features/devConnect/devConnectPreferences.ts +50 -5
  61. package/src/features/devConnect/devConnectUtils.ts +122 -15
  62. package/src/features/devConnect/index.ts +13 -0
  63. package/src/features/devConnect/nativeDevConnect.ts +128 -0
  64. package/src/features/devConnect/platformDetect.ts +8 -13
  65. package/src/features/devConnect/types.ts +3 -0
  66. package/src/utils/debugPreferences.ts +49 -4
@@ -6,20 +6,50 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.loadDevConnectPreferences = loadDevConnectPreferences;
7
7
  exports.restoreDevConnectSettingsToDaemon = restoreDevConnectSettingsToDaemon;
8
8
  exports.saveComputerHost = saveComputerHost;
9
+ exports.saveComputerTarget = saveComputerTarget;
10
+ exports.saveDaemonPort = saveDaemonPort;
11
+ exports.saveMetroPort = saveMetroPort;
9
12
  var _DaemonClient = require("../../utils/DaemonClient");
10
13
  var _debugPreferences = require("../../utils/debugPreferences");
11
14
  var _devConnectUtils = require("./devConnectUtils");
12
15
  var _platformDetect = require("./platformDetect");
13
16
  async function loadDevConnectPreferences() {
14
17
  const storedHost = await (0, _debugPreferences.getPreference)(_debugPreferences.KEYS.computerHost);
18
+ const storedMetroPort = await (0, _debugPreferences.getPreference)(_debugPreferences.KEYS.metroPort);
19
+ const storedDaemonPort = await (0, _debugPreferences.getPreference)(_debugPreferences.KEYS.daemonPort);
15
20
  return {
16
- computerHost: storedHost ? (0, _devConnectUtils.normalizeComputerHost)(storedHost) ?? '' : ''
21
+ computerHost: storedHost ? (0, _devConnectUtils.normalizeComputerHost)(storedHost) ?? '' : '',
22
+ metroPort: storedMetroPort ? (0, _devConnectUtils.normalizePort)(storedMetroPort) ?? _devConnectUtils.DEFAULT_METRO_PORT : _devConnectUtils.DEFAULT_METRO_PORT,
23
+ daemonPort: storedDaemonPort ? (0, _devConnectUtils.normalizePort)(storedDaemonPort) ?? _devConnectUtils.DEFAULT_DAEMON_PORT : _devConnectUtils.DEFAULT_DAEMON_PORT
17
24
  };
18
25
  }
26
+ async function saveComputerTarget(value) {
27
+ const target = (0, _devConnectUtils.parseComputerTarget)(value);
28
+ if (!target) {
29
+ return null;
30
+ }
31
+ await (0, _debugPreferences.setPreference)(_debugPreferences.KEYS.computerHost, target.computerHost);
32
+ await (0, _debugPreferences.setPreference)(_debugPreferences.KEYS.metroPort, target.metroPort);
33
+ return target;
34
+ }
19
35
  async function saveComputerHost(value) {
20
- const normalized = (0, _devConnectUtils.normalizeComputerHost)(value);
21
- if (!normalized) return null;
22
- await (0, _debugPreferences.setPreference)(_debugPreferences.KEYS.computerHost, normalized);
36
+ const target = await saveComputerTarget(value);
37
+ return target?.computerHost ?? null;
38
+ }
39
+ async function saveMetroPort(value) {
40
+ const normalized = (0, _devConnectUtils.normalizePort)(value);
41
+ if (!normalized) {
42
+ return null;
43
+ }
44
+ await (0, _debugPreferences.setPreference)(_debugPreferences.KEYS.metroPort, normalized);
45
+ return normalized;
46
+ }
47
+ async function saveDaemonPort(value) {
48
+ const normalized = (0, _devConnectUtils.normalizePort)(value);
49
+ if (!normalized) {
50
+ return null;
51
+ }
52
+ await (0, _debugPreferences.setPreference)(_debugPreferences.KEYS.daemonPort, normalized);
23
53
  return normalized;
24
54
  }
25
55
  async function restoreDevConnectSettingsToDaemon() {
@@ -28,7 +58,7 @@ async function restoreDevConnectSettingsToDaemon() {
28
58
  _DaemonClient.daemonClient.configure({
29
59
  mode,
30
60
  endpoint: '',
31
- deviceHost: mode === 'simulator' ? '' : preferences.computerHost,
61
+ deviceHost: mode === 'simulator' ? '' : (0, _devConnectUtils.buildDaemonDeviceHost)(preferences.computerHost, preferences.daemonPort),
32
62
  token: ''
33
63
  });
34
64
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_DaemonClient","require","_debugPreferences","_devConnectUtils","_platformDetect","loadDevConnectPreferences","storedHost","getPreference","KEYS","computerHost","normalizeComputerHost","saveComputerHost","value","normalized","setPreference","restoreDevConnectSettingsToDaemon","preferences","mode","isSimulator","daemonClient","configure","endpoint","deviceHost","token"],"sourceRoot":"../../../../src","sources":["features/devConnect/devConnectPreferences.ts"],"mappings":";;;;;;;;AAAA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AAMO,eAAeI,yBAAyBA,CAAA,EAAmC;EAChF,MAAMC,UAAU,GAAG,MAAM,IAAAC,+BAAa,EAACC,sBAAI,CAACC,YAAY,CAAC;EACzD,OAAO;IACLA,YAAY,EAAEH,UAAU,GAAG,IAAAI,sCAAqB,EAACJ,UAAU,CAAC,IAAI,EAAE,GAAG;EACvE,CAAC;AACH;AAEO,eAAeK,gBAAgBA,CAACC,KAAa,EAA0B;EAC5E,MAAMC,UAAU,GAAG,IAAAH,sCAAqB,EAACE,KAAK,CAAC;EAC/C,IAAI,CAACC,UAAU,EAAE,OAAO,IAAI;EAC5B,MAAM,IAAAC,+BAAa,EAACN,sBAAI,CAACC,YAAY,EAAEI,UAAU,CAAC;EAClD,OAAOA,UAAU;AACnB;AAEO,eAAeE,iCAAiCA,CAAA,EAAkB;EACvE,MAAMC,WAAW,GAAG,MAAMX,yBAAyB,CAAC,CAAC;EACrD,MAAMY,IAAI,GAAG,IAAAC,2BAAW,EAAC,CAAC,GAAG,WAAW,GAAY,QAAiB;EACrEC,0BAAY,CAACC,SAAS,CAAC;IACrBH,IAAI;IACJI,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAEL,IAAI,KAAK,WAAW,GAAG,EAAE,GAAGD,WAAW,CAACP,YAAY;IAChEc,KAAK,EAAE;EACT,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["_DaemonClient","require","_debugPreferences","_devConnectUtils","_platformDetect","loadDevConnectPreferences","storedHost","getPreference","KEYS","computerHost","storedMetroPort","metroPort","storedDaemonPort","daemonPort","normalizeComputerHost","normalizePort","DEFAULT_METRO_PORT","DEFAULT_DAEMON_PORT","saveComputerTarget","value","target","parseComputerTarget","setPreference","saveComputerHost","saveMetroPort","normalized","saveDaemonPort","restoreDevConnectSettingsToDaemon","preferences","mode","isSimulator","daemonClient","configure","endpoint","deviceHost","buildDaemonDeviceHost","token"],"sourceRoot":"../../../../src","sources":["features/devConnect/devConnectPreferences.ts"],"mappings":";;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AASA,IAAAG,eAAA,GAAAH,OAAA;AAQO,eAAeI,yBAAyBA,CAAA,EAAmC;EAChF,MAAMC,UAAU,GAAG,MAAM,IAAAC,+BAAa,EAACC,sBAAI,CAACC,YAAY,CAAC;EACzD,MAAMC,eAAe,GAAG,MAAM,IAAAH,+BAAa,EAACC,sBAAI,CAACG,SAAS,CAAC;EAC3D,MAAMC,gBAAgB,GAAG,MAAM,IAAAL,+BAAa,EAACC,sBAAI,CAACK,UAAU,CAAC;EAC7D,OAAO;IACLJ,YAAY,EAAEH,UAAU,GAAG,IAAAQ,sCAAqB,EAACR,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;IACvEK,SAAS,EAAED,eAAe,GAAG,IAAAK,8BAAa,EAACL,eAAe,CAAC,IAAIM,mCAAkB,GAAGA,mCAAkB;IACtGH,UAAU,EAAED,gBAAgB,GAAG,IAAAG,8BAAa,EAACH,gBAAgB,CAAC,IAAIK,oCAAmB,GAAGA;EAC1F,CAAC;AACH;AAEO,eAAeC,kBAAkBA,CAACC,KAAa,EAAwC;EAC5F,MAAMC,MAAM,GAAG,IAAAC,oCAAmB,EAACF,KAAK,CAAC;EACzC,IAAI,CAACC,MAAM,EAAE;IACX,OAAO,IAAI;EACb;EAEA,MAAM,IAAAE,+BAAa,EAACd,sBAAI,CAACC,YAAY,EAAEW,MAAM,CAACX,YAAY,CAAC;EAC3D,MAAM,IAAAa,+BAAa,EAACd,sBAAI,CAACG,SAAS,EAAES,MAAM,CAACT,SAAS,CAAC;EACrD,OAAOS,MAAM;AACf;AAEO,eAAeG,gBAAgBA,CAACJ,KAAa,EAA0B;EAC5E,MAAMC,MAAM,GAAG,MAAMF,kBAAkB,CAACC,KAAK,CAAC;EAC9C,OAAOC,MAAM,EAAEX,YAAY,IAAI,IAAI;AACrC;AAEO,eAAee,aAAaA,CAACL,KAAa,EAA0B;EACzE,MAAMM,UAAU,GAAG,IAAAV,8BAAa,EAACI,KAAK,CAAC;EACvC,IAAI,CAACM,UAAU,EAAE;IACf,OAAO,IAAI;EACb;EAEA,MAAM,IAAAH,+BAAa,EAACd,sBAAI,CAACG,SAAS,EAAEc,UAAU,CAAC;EAC/C,OAAOA,UAAU;AACnB;AAEO,eAAeC,cAAcA,CAACP,KAAa,EAA0B;EAC1E,MAAMM,UAAU,GAAG,IAAAV,8BAAa,EAACI,KAAK,CAAC;EACvC,IAAI,CAACM,UAAU,EAAE;IACf,OAAO,IAAI;EACb;EAEA,MAAM,IAAAH,+BAAa,EAACd,sBAAI,CAACK,UAAU,EAAEY,UAAU,CAAC;EAChD,OAAOA,UAAU;AACnB;AAEO,eAAeE,iCAAiCA,CAAA,EAAkB;EACvE,MAAMC,WAAW,GAAG,MAAMvB,yBAAyB,CAAC,CAAC;EACrD,MAAMwB,IAAI,GAAG,IAAAC,2BAAW,EAAC,CAAC,GAAG,WAAW,GAAY,QAAiB;EACrEC,0BAAY,CAACC,SAAS,CAAC;IACrBH,IAAI;IACJI,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAEL,IAAI,KAAK,WAAW,GAC5B,EAAE,GACF,IAAAM,sCAAqB,EAACP,WAAW,CAACnB,YAAY,EAAEmB,WAAW,CAACf,UAAU,CAAC;IAC3EuB,KAAK,EAAE;EACT,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -3,15 +3,25 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.DEFAULT_METRO_PORT = exports.DEFAULT_DAEMON_PORT = void 0;
7
+ exports.buildDaemonDeviceHost = buildDaemonDeviceHost;
8
+ exports.buildMetroTarget = buildMetroTarget;
6
9
  exports.buildMetroUrls = buildMetroUrls;
7
10
  exports.normalizeComputerHost = normalizeComputerHost;
11
+ exports.normalizePort = normalizePort;
12
+ exports.parseComputerTarget = parseComputerTarget;
8
13
  exports.parseMetroQrPayload = parseMetroQrPayload;
9
- const METRO_PORT = '8081';
14
+ const DEFAULT_METRO_PORT = exports.DEFAULT_METRO_PORT = '8081';
15
+ const DEFAULT_DAEMON_PORT = exports.DEFAULT_DAEMON_PORT = '3799';
10
16
  function isValidIpv4(host) {
11
17
  const parts = host.split('.');
12
- if (parts.length !== 4) return false;
18
+ if (parts.length !== 4) {
19
+ return false;
20
+ }
13
21
  return parts.every(part => {
14
- if (!/^\d{1,3}$/.test(part)) return false;
22
+ if (!/^\d{1,3}$/.test(part)) {
23
+ return false;
24
+ }
15
25
  const value = Number(part);
16
26
  return value >= 0 && value <= 255 && String(value) === part;
17
27
  });
@@ -23,31 +33,105 @@ function toUrlInput(raw) {
23
33
  }
24
34
  return `http://${trimmed}`;
25
35
  }
26
- function normalizeComputerHost(raw) {
36
+ function parseHostAndPort(raw) {
27
37
  const trimmed = raw.trim();
28
- if (!trimmed) return null;
38
+ if (!trimmed) {
39
+ return null;
40
+ }
29
41
  try {
30
42
  const parsed = new URL(toUrlInput(trimmed));
31
- const host = parsed.hostname.trim();
32
- return isValidIpv4(host) ? host : null;
43
+ return {
44
+ host: parsed.hostname.trim(),
45
+ port: parsed.port.trim()
46
+ };
33
47
  } catch {
34
48
  return null;
35
49
  }
36
50
  }
37
- function buildMetroUrls(rawHost) {
38
- const host = normalizeComputerHost(rawHost);
39
- if (!host) return null;
51
+ function normalizeComputerHost(raw) {
52
+ const parsed = parseHostAndPort(raw);
53
+ if (!parsed) {
54
+ return null;
55
+ }
56
+ return isValidIpv4(parsed.host) ? parsed.host : null;
57
+ }
58
+ function normalizePort(raw) {
59
+ const trimmed = raw.trim();
60
+ if (!/^\d+$/.test(trimmed)) {
61
+ return null;
62
+ }
63
+ const value = Number(trimmed);
64
+ if (!Number.isInteger(value) || value < 1 || value > 65535) {
65
+ return null;
66
+ }
67
+ return String(value);
68
+ }
69
+ function parseComputerTarget(raw) {
70
+ const parsed = parseHostAndPort(raw);
71
+ if (!parsed || !isValidIpv4(parsed.host)) {
72
+ return null;
73
+ }
74
+ const metroPort = parsed.port ? normalizePort(parsed.port) : DEFAULT_METRO_PORT;
75
+ if (!metroPort) {
76
+ return null;
77
+ }
78
+ return {
79
+ computerHost: parsed.host,
80
+ metroPort
81
+ };
82
+ }
83
+ function normalizeMetroHost(rawHost) {
84
+ const parsed = parseHostAndPort(rawHost);
85
+ if (!parsed) {
86
+ return null;
87
+ }
88
+ if (parsed.host === 'localhost') {
89
+ return parsed.host;
90
+ }
91
+ return isValidIpv4(parsed.host) ? parsed.host : null;
92
+ }
93
+ function buildMetroTarget(rawHost, rawPort = DEFAULT_METRO_PORT) {
94
+ const host = normalizeMetroHost(rawHost);
95
+ if (!host) {
96
+ return null;
97
+ }
98
+ const port = normalizePort(rawPort);
99
+ if (!port) {
100
+ return null;
101
+ }
40
102
  return {
41
- expUrl: `exp://${host}:${METRO_PORT}`,
42
- httpUrl: `http://${host}:${METRO_PORT}`
103
+ host,
104
+ port,
105
+ hostPort: `${host}:${port}`,
106
+ statusUrl: `http://${host}:${port}/status`
107
+ };
108
+ }
109
+ function buildMetroUrls(rawHost, rawPort = DEFAULT_METRO_PORT) {
110
+ const target = buildMetroTarget(rawHost, rawPort);
111
+ if (!target) {
112
+ return null;
113
+ }
114
+ return {
115
+ expUrl: `exp://${target.hostPort}`,
116
+ httpUrl: `http://${target.hostPort}`
43
117
  };
44
118
  }
45
119
  function parseMetroQrPayload(payload) {
46
- const computerHost = normalizeComputerHost(payload);
47
- if (!computerHost) return null;
120
+ const target = parseComputerTarget(payload);
121
+ if (!target) {
122
+ return null;
123
+ }
48
124
  return {
49
- computerHost,
125
+ ...target,
50
126
  source: payload
51
127
  };
52
128
  }
129
+ function buildDaemonDeviceHost(computerHost, daemonPort) {
130
+ const host = normalizeComputerHost(computerHost);
131
+ if (!host) {
132
+ return '';
133
+ }
134
+ const port = normalizePort(daemonPort) ?? DEFAULT_DAEMON_PORT;
135
+ return port === DEFAULT_DAEMON_PORT ? host : `${host}:${port}`;
136
+ }
53
137
  //# sourceMappingURL=devConnectUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["METRO_PORT","isValidIpv4","host","parts","split","length","every","part","test","value","Number","String","toUrlInput","raw","trimmed","trim","normalizeComputerHost","parsed","URL","hostname","buildMetroUrls","rawHost","expUrl","httpUrl","parseMetroQrPayload","payload","computerHost","source"],"sourceRoot":"../../../../src","sources":["features/devConnect/devConnectUtils.ts"],"mappings":";;;;;;;;AAAA,MAAMA,UAAU,GAAG,MAAM;AAYzB,SAASC,WAAWA,CAACC,IAAY,EAAW;EAC1C,MAAMC,KAAK,GAAGD,IAAI,CAACE,KAAK,CAAC,GAAG,CAAC;EAC7B,IAAID,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE,OAAO,KAAK;EAEpC,OAAOF,KAAK,CAACG,KAAK,CAAEC,IAAI,IAAK;IAC3B,IAAI,CAAC,WAAW,CAACC,IAAI,CAACD,IAAI,CAAC,EAAE,OAAO,KAAK;IACzC,MAAME,KAAK,GAAGC,MAAM,CAACH,IAAI,CAAC;IAC1B,OAAOE,KAAK,IAAI,CAAC,IAAIA,KAAK,IAAI,GAAG,IAAIE,MAAM,CAACF,KAAK,CAAC,KAAKF,IAAI;EAC7D,CAAC,CAAC;AACJ;AAEA,SAASK,UAAUA,CAACC,GAAW,EAAU;EACvC,MAAMC,OAAO,GAAGD,GAAG,CAACE,IAAI,CAAC,CAAC;EAC1B,IAAI,8BAA8B,CAACP,IAAI,CAACM,OAAO,CAAC,EAAE;IAChD,OAAOA,OAAO;EAChB;EACA,OAAO,UAAUA,OAAO,EAAE;AAC5B;AAEO,SAASE,qBAAqBA,CAACH,GAAW,EAAiB;EAChE,MAAMC,OAAO,GAAGD,GAAG,CAACE,IAAI,CAAC,CAAC;EAC1B,IAAI,CAACD,OAAO,EAAE,OAAO,IAAI;EAEzB,IAAI;IACF,MAAMG,MAAM,GAAG,IAAIC,GAAG,CAACN,UAAU,CAACE,OAAO,CAAC,CAAC;IAC3C,MAAMZ,IAAI,GAAGe,MAAM,CAACE,QAAQ,CAACJ,IAAI,CAAC,CAAC;IACnC,OAAOd,WAAW,CAACC,IAAI,CAAC,GAAGA,IAAI,GAAG,IAAI;EACxC,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEO,SAASkB,cAAcA,CAACC,OAAe,EAAoB;EAChE,MAAMnB,IAAI,GAAGc,qBAAqB,CAACK,OAAO,CAAC;EAC3C,IAAI,CAACnB,IAAI,EAAE,OAAO,IAAI;EAEtB,OAAO;IACLoB,MAAM,EAAE,SAASpB,IAAI,IAAIF,UAAU,EAAE;IACrCuB,OAAO,EAAE,UAAUrB,IAAI,IAAIF,UAAU;EACvC,CAAC;AACH;AAEO,SAASwB,mBAAmBA,CAACC,OAAe,EAA+B;EAChF,MAAMC,YAAY,GAAGV,qBAAqB,CAACS,OAAO,CAAC;EACnD,IAAI,CAACC,YAAY,EAAE,OAAO,IAAI;EAC9B,OAAO;IAAEA,YAAY;IAAEC,MAAM,EAAEF;EAAQ,CAAC;AAC1C","ignoreList":[]}
1
+ {"version":3,"names":["DEFAULT_METRO_PORT","exports","DEFAULT_DAEMON_PORT","isValidIpv4","host","parts","split","length","every","part","test","value","Number","String","toUrlInput","raw","trimmed","trim","parseHostAndPort","parsed","URL","hostname","port","normalizeComputerHost","normalizePort","isInteger","parseComputerTarget","metroPort","computerHost","normalizeMetroHost","rawHost","buildMetroTarget","rawPort","hostPort","statusUrl","buildMetroUrls","target","expUrl","httpUrl","parseMetroQrPayload","payload","source","buildDaemonDeviceHost","daemonPort"],"sourceRoot":"../../../../src","sources":["features/devConnect/devConnectUtils.ts"],"mappings":"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","ignoreList":[]}
@@ -22,6 +22,18 @@ Object.defineProperty(exports, "normalizeComputerHost", {
22
22
  return _devConnectUtils.normalizeComputerHost;
23
23
  }
24
24
  });
25
+ Object.defineProperty(exports, "normalizePort", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _devConnectUtils.normalizePort;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "parseComputerTarget", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _devConnectUtils.parseComputerTarget;
35
+ }
36
+ });
25
37
  Object.defineProperty(exports, "parseMetroQrPayload", {
26
38
  enumerable: true,
27
39
  get: function () {
@@ -40,18 +52,40 @@ Object.defineProperty(exports, "saveComputerHost", {
40
52
  return _devConnectPreferences.saveComputerHost;
41
53
  }
42
54
  });
55
+ Object.defineProperty(exports, "saveComputerTarget", {
56
+ enumerable: true,
57
+ get: function () {
58
+ return _devConnectPreferences.saveComputerTarget;
59
+ }
60
+ });
61
+ Object.defineProperty(exports, "saveDaemonPort", {
62
+ enumerable: true,
63
+ get: function () {
64
+ return _devConnectPreferences.saveDaemonPort;
65
+ }
66
+ });
67
+ Object.defineProperty(exports, "saveMetroPort", {
68
+ enumerable: true,
69
+ get: function () {
70
+ return _devConnectPreferences.saveMetroPort;
71
+ }
72
+ });
43
73
  var _DevConnectTab = require("./DevConnectTab");
44
74
  var _cameraKit = require("./cameraKit");
45
75
  var _devConnectPreferences = require("./devConnectPreferences");
76
+ var _devConnectUtils = require("./devConnectUtils");
77
+ var _nativeDevConnect = require("./nativeDevConnect");
46
78
  var _platformDetect = require("./platformDetect");
47
79
  var _DaemonClient = require("../../utils/DaemonClient");
48
- var _devConnectUtils = require("./devConnectUtils");
49
80
  const createDevConnectFeature = () => {
50
81
  const listeners = new Set();
51
82
  let state = {
52
83
  isSimulator: (0, _platformDetect.isSimulator)(),
53
84
  computerHost: '',
85
+ metroPort: _devConnectUtils.DEFAULT_METRO_PORT,
86
+ daemonPort: _devConnectUtils.DEFAULT_DAEMON_PORT,
54
87
  qrAvailable: (0, _cameraKit.isCameraKitAvailable)(),
88
+ nativeMetroAvailable: (0, _nativeDevConnect.isNativeDevConnectAvailable)(),
55
89
  streaming: _DaemonClient.daemonClient.isConnected()
56
90
  };
57
91
  const notify = () => {
@@ -69,7 +103,10 @@ const createDevConnectFeature = () => {
69
103
  (0, _devConnectPreferences.loadDevConnectPreferences)().then(preferences => {
70
104
  state = {
71
105
  ...state,
72
- computerHost: preferences.computerHost
106
+ computerHost: preferences.computerHost,
107
+ metroPort: preferences.metroPort,
108
+ daemonPort: preferences.daemonPort,
109
+ nativeMetroAvailable: (0, _nativeDevConnect.isNativeDevConnectAvailable)()
73
110
  };
74
111
  notify();
75
112
  }).catch(() => {
@@ -1 +1 @@
1
- {"version":3,"names":["_DevConnectTab","require","_cameraKit","_devConnectPreferences","_platformDetect","_DaemonClient","_devConnectUtils","createDevConnectFeature","listeners","Set","state","isSimulator","computerHost","qrAvailable","isCameraKitAvailable","streaming","daemonClient","isConnected","notify","forEach","listener","name","label","renderContent","DevConnectTab","setup","loadDevConnectPreferences","then","preferences","catch","getSnapshot","cleanup","clear","subscribe","add","delete","exports"],"sourceRoot":"../../../../src","sources":["features/devConnect/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;AAKA,IAAAK,gBAAA,GAAAL,OAAA;AAWO,MAAMM,uBAAuB,GAAGA,CAAA,KAAqC;EAC1E,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAuB,CAAC;EACjD,IAAIC,KAAsB,GAAG;IAC3BC,WAAW,EAAE,IAAAA,2BAAW,EAAC,CAAC;IAC1BC,YAAY,EAAE,EAAE;IAChBC,WAAW,EAAE,IAAAC,+BAAoB,EAAC,CAAC;IACnCC,SAAS,EAAEC,0BAAY,CAACC,WAAW,CAAC;EACtC,CAAC;EAED,MAAMC,MAAM,GAAGA,CAAA,KAAM;IACnBR,KAAK,GAAG;MACN,GAAGA,KAAK;MACRK,SAAS,EAAEC,0BAAY,CAACC,WAAW,CAAC;IACtC,CAAC;IACDT,SAAS,CAACW,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAAC,CAAC,CAAC;EAC7C,CAAC;EAED,OAAO;IACLC,IAAI,EAAE,YAAY;IAClBC,KAAK,EAAE,YAAY;IACnBC,aAAa,EAAEC,4BAAa;IAC5BC,KAAKA,CAAA,EAAG;MACN,IAAAC,gDAAyB,EAAC,CAAC,CAACC,IAAI,CAAEC,WAAW,IAAK;QAChDlB,KAAK,GAAG;UACN,GAAGA,KAAK;UACRE,YAAY,EAAEgB,WAAW,CAAChB;QAC5B,CAAC;QACDM,MAAM,CAAC,CAAC;MACV,CAAC,CAAC,CAACW,KAAK,CAAC,MAAM;QACbX,MAAM,CAAC,CAAC;MACV,CAAC,CAAC;IACJ,CAAC;IACDY,WAAW,EAAEA,CAAA,KAAMpB,KAAK;IACxBqB,OAAOA,CAAA,EAAG;MACRvB,SAAS,CAACwB,KAAK,CAAC,CAAC;IACnB,CAAC;IACDC,SAASA,CAACb,QAAQ,EAAE;MAClBZ,SAAS,CAAC0B,GAAG,CAACd,QAAQ,CAAC;MACvB,OAAO,MAAM;QACXZ,SAAS,CAAC2B,MAAM,CAACf,QAAQ,CAAC;MAC5B,CAAC;IACH;EACF,CAAC;AACH,CAAC;AAACgB,OAAA,CAAA7B,uBAAA,GAAAA,uBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_DevConnectTab","require","_cameraKit","_devConnectPreferences","_devConnectUtils","_nativeDevConnect","_platformDetect","_DaemonClient","createDevConnectFeature","listeners","Set","state","isSimulator","computerHost","metroPort","DEFAULT_METRO_PORT","daemonPort","DEFAULT_DAEMON_PORT","qrAvailable","isCameraKitAvailable","nativeMetroAvailable","isNativeDevConnectAvailable","streaming","daemonClient","isConnected","notify","forEach","listener","name","label","renderContent","DevConnectTab","setup","loadDevConnectPreferences","then","preferences","catch","getSnapshot","cleanup","clear","subscribe","add","delete","exports"],"sourceRoot":"../../../../src","sources":["features/devConnect/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AACA,IAAAG,gBAAA,GAAAH,OAAA;AACA,IAAAI,iBAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAN,OAAA;AAqBO,MAAMO,uBAAuB,GAAGA,CAAA,KAAqC;EAC1E,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAuB,CAAC;EACjD,IAAIC,KAAsB,GAAG;IAC3BC,WAAW,EAAE,IAAAA,2BAAW,EAAC,CAAC;IAC1BC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAEC,mCAAkB;IAC7BC,UAAU,EAAEC,oCAAmB;IAC/BC,WAAW,EAAE,IAAAC,+BAAoB,EAAC,CAAC;IACnCC,oBAAoB,EAAE,IAAAC,6CAA2B,EAAC,CAAC;IACnDC,SAAS,EAAEC,0BAAY,CAACC,WAAW,CAAC;EACtC,CAAC;EAED,MAAMC,MAAM,GAAGA,CAAA,KAAM;IACnBd,KAAK,GAAG;MACN,GAAGA,KAAK;MACRW,SAAS,EAAEC,0BAAY,CAACC,WAAW,CAAC;IACtC,CAAC;IACDf,SAAS,CAACiB,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAAC,CAAC,CAAC;EAC7C,CAAC;EAED,OAAO;IACLC,IAAI,EAAE,YAAY;IAClBC,KAAK,EAAE,YAAY;IACnBC,aAAa,EAAEC,4BAAa;IAC5BC,KAAKA,CAAA,EAAG;MACN,IAAAC,gDAAyB,EAAC,CAAC,CAACC,IAAI,CAAEC,WAAW,IAAK;QAChDxB,KAAK,GAAG;UACN,GAAGA,KAAK;UACRE,YAAY,EAAEsB,WAAW,CAACtB,YAAY;UACtCC,SAAS,EAAEqB,WAAW,CAACrB,SAAS;UAChCE,UAAU,EAAEmB,WAAW,CAACnB,UAAU;UAClCI,oBAAoB,EAAE,IAAAC,6CAA2B,EAAC;QACpD,CAAC;QACDI,MAAM,CAAC,CAAC;MACV,CAAC,CAAC,CAACW,KAAK,CAAC,MAAM;QACbX,MAAM,CAAC,CAAC;MACV,CAAC,CAAC;IACJ,CAAC;IACDY,WAAW,EAAEA,CAAA,KAAM1B,KAAK;IACxB2B,OAAOA,CAAA,EAAG;MACR7B,SAAS,CAAC8B,KAAK,CAAC,CAAC;IACnB,CAAC;IACDC,SAASA,CAACb,QAAQ,EAAE;MAClBlB,SAAS,CAACgC,GAAG,CAACd,QAAQ,CAAC;MACvB,OAAO,MAAM;QACXlB,SAAS,CAACiC,MAAM,CAACf,QAAQ,CAAC;MAC5B,CAAC;IACH;EACF,CAAC;AACH,CAAC;AAACgB,OAAA,CAAAnC,uBAAA,GAAAA,uBAAA","ignoreList":[]}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.applyMetroBundle = applyMetroBundle;
7
+ exports.isNativeDevConnectAvailable = isNativeDevConnectAvailable;
8
+ exports.resetMetroBundle = resetMetroBundle;
9
+ var _reactNative = require("react-native");
10
+ var _devConnectUtils = require("./devConnectUtils");
11
+ function getNativeModule() {
12
+ const nativeModule = _reactNative.NativeModules.DebugToolkitDevConnect;
13
+ if (nativeModule && typeof nativeModule.applyMetroHost === 'function' && typeof nativeModule.resetMetroHost === 'function') {
14
+ return nativeModule;
15
+ }
16
+ return null;
17
+ }
18
+ function isNativeDevConnectAvailable() {
19
+ return getNativeModule() !== null;
20
+ }
21
+ async function checkMetroStatus(statusUrl) {
22
+ const fetchImpl = globalThis.fetch;
23
+ if (!fetchImpl) {
24
+ return {
25
+ ok: false,
26
+ reason: 'fetch_unavailable',
27
+ statusUrl,
28
+ error: 'global fetch is not available'
29
+ };
30
+ }
31
+ try {
32
+ const response = await fetchImpl(statusUrl, {
33
+ method: 'GET'
34
+ });
35
+ const body = typeof response.text === 'function' ? await response.text() : '';
36
+ if (response.ok === false || !body.includes('packager-status:running')) {
37
+ return {
38
+ ok: false,
39
+ reason: 'metro_unreachable',
40
+ statusUrl,
41
+ error: body || 'Metro status endpoint did not report running'
42
+ };
43
+ }
44
+ return null;
45
+ } catch (error) {
46
+ return {
47
+ ok: false,
48
+ reason: 'metro_unreachable',
49
+ statusUrl,
50
+ error: error instanceof Error ? error.message : String(error)
51
+ };
52
+ }
53
+ }
54
+ async function applyMetroBundle(host, port) {
55
+ const target = (0, _devConnectUtils.buildMetroTarget)(host, port);
56
+ if (!target) {
57
+ return {
58
+ ok: false,
59
+ reason: 'invalid_target'
60
+ };
61
+ }
62
+ const nativeModule = getNativeModule();
63
+ if (!nativeModule) {
64
+ return {
65
+ ok: false,
66
+ reason: 'native_unavailable'
67
+ };
68
+ }
69
+ const statusError = await checkMetroStatus(target.statusUrl);
70
+ if (statusError) {
71
+ return statusError;
72
+ }
73
+ try {
74
+ const result = await nativeModule.applyMetroHost(target.hostPort);
75
+ _reactNative.DevSettings.reload?.('DebugToolkit DevConnect Metro host changed');
76
+ return {
77
+ ok: true,
78
+ hostPort: result && typeof result.hostPort === 'string' ? result.hostPort : target.hostPort
79
+ };
80
+ } catch (error) {
81
+ return {
82
+ ok: false,
83
+ reason: 'native_error',
84
+ error: error instanceof Error ? error.message : String(error)
85
+ };
86
+ }
87
+ }
88
+ async function resetMetroBundle() {
89
+ const nativeModule = getNativeModule();
90
+ if (!nativeModule) {
91
+ return {
92
+ ok: false,
93
+ reason: 'native_unavailable'
94
+ };
95
+ }
96
+ try {
97
+ await nativeModule.resetMetroHost();
98
+ _reactNative.DevSettings.reload?.('DebugToolkit DevConnect Metro host reset');
99
+ return {
100
+ ok: true
101
+ };
102
+ } catch (error) {
103
+ return {
104
+ ok: false,
105
+ reason: 'native_error',
106
+ error: error instanceof Error ? error.message : String(error)
107
+ };
108
+ }
109
+ }
110
+ //# sourceMappingURL=nativeDevConnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_devConnectUtils","getNativeModule","nativeModule","NativeModules","DebugToolkitDevConnect","applyMetroHost","resetMetroHost","isNativeDevConnectAvailable","checkMetroStatus","statusUrl","fetchImpl","globalThis","fetch","ok","reason","error","response","method","body","text","includes","Error","message","String","applyMetroBundle","host","port","target","buildMetroTarget","statusError","result","hostPort","DevSettings","reload","resetMetroBundle"],"sourceRoot":"../../../../src","sources":["features/devConnect/nativeDevConnect.ts"],"mappings":"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","ignoreList":[]}
@@ -9,21 +9,17 @@ function isSimulator() {
9
9
  const {
10
10
  OS
11
11
  } = _reactNative.Platform;
12
+ const constants = _reactNative.Platform.constants ?? {};
12
13
  if (OS === 'android') {
13
- const constants = _reactNative.Platform.constants;
14
- if (constants.isEmulator === true) return true;
15
- const model = String(constants.Model ?? '').toLowerCase();
14
+ if (constants.isEmulator === true) {
15
+ return true;
16
+ }
17
+ const model = String(constants.Model ?? constants.model ?? '').toLowerCase();
16
18
  return model.includes('sdk') || model.includes('emulator') || model.includes('google_sdk');
17
19
  }
18
20
  if (OS === 'ios') {
19
- // NativeModules.KCKFCSupportManager is absent on simulator,
20
- // but the most reliable check is the DeviceInfo model name.
21
- const deviceInfo = _reactNative.NativeModules.DeviceInfo ?? _reactNative.NativeModules.PlatformConstants;
22
- if (deviceInfo) {
23
- const model = String(deviceInfo.model ?? '').toLowerCase();
24
- if (model.includes('simulator')) return true;
25
- }
26
- return false;
21
+ const model = String(constants.model ?? '').toLowerCase();
22
+ return model.includes('simulator');
27
23
  }
28
24
  return false;
29
25
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","isSimulator","OS","Platform","constants","isEmulator","model","String","Model","toLowerCase","includes","deviceInfo","NativeModules","DeviceInfo","PlatformConstants"],"sourceRoot":"../../../../src","sources":["features/devConnect/platformDetect.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEO,SAASC,WAAWA,CAAA,EAAY;EACrC,MAAM;IAAEC;EAAG,CAAC,GAAGC,qBAAQ;EAEvB,IAAID,EAAE,KAAK,SAAS,EAAE;IACpB,MAAME,SAAS,GAAGD,qBAAQ,CAACC,SAAoC;IAC/D,IAAIA,SAAS,CAACC,UAAU,KAAK,IAAI,EAAE,OAAO,IAAI;IAC9C,MAAMC,KAAK,GAAGC,MAAM,CAACH,SAAS,CAACI,KAAK,IAAI,EAAE,CAAC,CAACC,WAAW,CAAC,CAAC;IACzD,OAAOH,KAAK,CAACI,QAAQ,CAAC,KAAK,CAAC,IAAIJ,KAAK,CAACI,QAAQ,CAAC,UAAU,CAAC,IAAIJ,KAAK,CAACI,QAAQ,CAAC,YAAY,CAAC;EAC5F;EAEA,IAAIR,EAAE,KAAK,KAAK,EAAE;IAChB;IACA;IACA,MAAMS,UAAU,GAAGC,0BAAa,CAACC,UAAU,IACtCD,0BAAa,CAACE,iBAAiB;IACpC,IAAIH,UAAU,EAAE;MACd,MAAML,KAAK,GAAGC,MAAM,CAACI,UAAU,CAACL,KAAK,IAAI,EAAE,CAAC,CAACG,WAAW,CAAC,CAAC;MAC1D,IAAIH,KAAK,CAACI,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,IAAI;IAC9C;IACA,OAAO,KAAK;EACd;EAEA,OAAO,KAAK;AACd","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","isSimulator","OS","Platform","constants","isEmulator","model","String","Model","toLowerCase","includes"],"sourceRoot":"../../../../src","sources":["features/devConnect/platformDetect.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEO,SAASC,WAAWA,CAAA,EAAY;EACrC,MAAM;IAAEC;EAAG,CAAC,GAAGC,qBAAQ;EACvB,MAAMC,SAAS,GAAID,qBAAQ,CAACC,SAAS,IAAI,CAAC,CAA6B;EAEvE,IAAIF,EAAE,KAAK,SAAS,EAAE;IACpB,IAAIE,SAAS,CAACC,UAAU,KAAK,IAAI,EAAE;MACjC,OAAO,IAAI;IACb;IACA,MAAMC,KAAK,GAAGC,MAAM,CAACH,SAAS,CAACI,KAAK,IAAIJ,SAAS,CAACE,KAAK,IAAI,EAAE,CAAC,CAACG,WAAW,CAAC,CAAC;IAC5E,OAAOH,KAAK,CAACI,QAAQ,CAAC,KAAK,CAAC,IAAIJ,KAAK,CAACI,QAAQ,CAAC,UAAU,CAAC,IAAIJ,KAAK,CAACI,QAAQ,CAAC,YAAY,CAAC;EAC5F;EAEA,IAAIR,EAAE,KAAK,KAAK,EAAE;IAChB,MAAMI,KAAK,GAAGC,MAAM,CAACH,SAAS,CAACE,KAAK,IAAI,EAAE,CAAC,CAACG,WAAW,CAAC,CAAC;IACzD,OAAOH,KAAK,CAACI,QAAQ,CAAC,WAAW,CAAC;EACpC;EAEA,OAAO,KAAK;AACd","ignoreList":[]}
@@ -6,14 +6,27 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.KEYS = void 0;
7
7
  exports.getPreference = getPreference;
8
8
  exports.setPreference = setPreference;
9
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
-
11
9
  const memoryStore = new Map();
12
10
  function loadAsyncStorage() {
13
11
  try {
14
- // eslint-disable-next-line @typescript-eslint/no-require-imports
15
12
  const mod = require('@react-native-async-storage/async-storage');
16
- if (mod && typeof mod.getItem === 'function') return mod;
13
+ if (mod && typeof mod.getItem === 'function') {
14
+ return mod;
15
+ }
16
+ return null;
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+ function loadNativePreferences() {
22
+ try {
23
+ const {
24
+ NativeModules
25
+ } = require('react-native');
26
+ const mod = NativeModules?.DebugToolkitDevConnect;
27
+ if (mod && typeof mod.getPreference === 'function' && typeof mod.setPreference === 'function') {
28
+ return mod;
29
+ }
17
30
  return null;
18
31
  } catch {
19
32
  return null;
@@ -25,6 +38,15 @@ async function setPreference(key, value) {
25
38
  if (AsyncStorage) {
26
39
  try {
27
40
  await AsyncStorage.setItem(key, value);
41
+ return;
42
+ } catch {
43
+ // degrade to memory only
44
+ }
45
+ }
46
+ const nativePreferences = loadNativePreferences();
47
+ if (nativePreferences) {
48
+ try {
49
+ await nativePreferences.setPreference(key, value);
28
50
  } catch {
29
51
  // degrade to memory only
30
52
  }
@@ -35,7 +57,20 @@ async function getPreference(key) {
35
57
  if (AsyncStorage) {
36
58
  try {
37
59
  const val = await AsyncStorage.getItem(key);
38
- if (val !== null) return val;
60
+ if (val !== null) {
61
+ return val;
62
+ }
63
+ } catch {
64
+ // fall through to memory
65
+ }
66
+ }
67
+ const nativePreferences = loadNativePreferences();
68
+ if (nativePreferences) {
69
+ try {
70
+ const val = await nativePreferences.getPreference(key);
71
+ if (val !== null) {
72
+ return val;
73
+ }
39
74
  } catch {
40
75
  // fall through to memory
41
76
  }
@@ -48,6 +83,8 @@ const KEYS = exports.KEYS = {
48
83
  consoleLogs: '@react_native_debug_toolkit/console_logs',
49
84
  networkLogs: '@react_native_debug_toolkit/network_logs',
50
85
  trackLogs: '@react_native_debug_toolkit/track_logs',
51
- computerHost: '@react_native_debug_toolkit/computer_host'
86
+ computerHost: '@react_native_debug_toolkit/computer_host',
87
+ metroPort: '@react_native_debug_toolkit/metro_port',
88
+ daemonPort: '@react_native_debug_toolkit/daemon_port'
52
89
  };
53
90
  //# sourceMappingURL=debugPreferences.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["memoryStore","Map","loadAsyncStorage","mod","require","getItem","setPreference","key","value","set","AsyncStorage","setItem","getPreference","val","get","KEYS","exports","fabPosition","lastTab","consoleLogs","networkLogs","trackLogs","computerHost"],"sourceRoot":"../../../src","sources":["utils/debugPreferences.ts"],"mappings":";;;;;;;;AAAA;;AAGA,MAAMA,WAAW,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAE7C,SAASC,gBAAgBA,CAAA,EAA4B;EACnD,IAAI;IACF;IACA,MAAMC,GAAG,GAAGC,OAAO,CAAC,2CAA2C,CAAC;IAChE,IAAID,GAAG,IAAI,OAAOA,GAAG,CAACE,OAAO,KAAK,UAAU,EAAE,OAAOF,GAAG;IACxD,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEO,eAAeG,aAAaA,CAACC,GAAW,EAAEC,KAAa,EAAiB;EAC7ER,WAAW,CAACS,GAAG,CAACF,GAAG,EAAEC,KAAK,CAAC;EAC3B,MAAME,YAAY,GAAGR,gBAAgB,CAAC,CAAC;EACvC,IAAIQ,YAAY,EAAE;IAChB,IAAI;MACF,MAAMA,YAAY,CAACC,OAAO,CAACJ,GAAG,EAAEC,KAAK,CAAC;IACxC,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;AACF;AAEO,eAAeI,aAAaA,CAACL,GAAW,EAA0B;EACvE,MAAMG,YAAY,GAAGR,gBAAgB,CAAC,CAAC;EACvC,IAAIQ,YAAY,EAAE;IAChB,IAAI;MACF,MAAMG,GAAG,GAAG,MAAMH,YAAY,CAACL,OAAO,CAACE,GAAG,CAAC;MAC3C,IAAIM,GAAG,KAAK,IAAI,EAAE,OAAOA,GAAG;IAC9B,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EACA,OAAOb,WAAW,CAACc,GAAG,CAACP,GAAG,CAAC,IAAI,IAAI;AACrC;AAEO,MAAMQ,IAAI,GAAAC,OAAA,CAAAD,IAAA,GAAG;EAClBE,WAAW,EAAE,0CAA0C;EACvDC,OAAO,EAAE,sCAAsC;EAC/CC,WAAW,EAAE,0CAA0C;EACvDC,WAAW,EAAE,0CAA0C;EACvDC,SAAS,EAAE,wCAAwC;EACnDC,YAAY,EAAE;AAChB,CAAU","ignoreList":[]}
1
+ {"version":3,"names":["memoryStore","Map","loadAsyncStorage","mod","require","getItem","loadNativePreferences","NativeModules","DebugToolkitDevConnect","getPreference","setPreference","key","value","set","AsyncStorage","setItem","nativePreferences","val","get","KEYS","exports","fabPosition","lastTab","consoleLogs","networkLogs","trackLogs","computerHost","metroPort","daemonPort"],"sourceRoot":"../../../src","sources":["utils/debugPreferences.ts"],"mappings":";;;;;;;;AAGA,MAAMA,WAAW,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAE7C,SAASC,gBAAgBA,CAAA,EAA4B;EACnD,IAAI;IACF,MAAMC,GAAG,GAAGC,OAAO,CAAC,2CAA2C,CAAC;IAChE,IAAID,GAAG,IAAI,OAAOA,GAAG,CAACE,OAAO,KAAK,UAAU,EAAE;MAC5C,OAAOF,GAAG;IACZ;IACA,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,SAASG,qBAAqBA,CAAA,EAAiC;EAC7D,IAAI;IACF,MAAM;MAAEC;IAAc,CAAC,GAAGH,OAAO,CAAC,cAAc,CAAoF;IACpI,MAAMD,GAAG,GAAGI,aAAa,EAAEC,sBAAsB;IACjD,IACEL,GAAG,IACH,OAAOA,GAAG,CAACM,aAAa,KAAK,UAAU,IACvC,OAAON,GAAG,CAACO,aAAa,KAAK,UAAU,EACvC;MACA,OAAOP,GAAG;IACZ;IACA,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEO,eAAeO,aAAaA,CAACC,GAAW,EAAEC,KAAa,EAAiB;EAC7EZ,WAAW,CAACa,GAAG,CAACF,GAAG,EAAEC,KAAK,CAAC;EAC3B,MAAME,YAAY,GAAGZ,gBAAgB,CAAC,CAAC;EACvC,IAAIY,YAAY,EAAE;IAChB,IAAI;MACF,MAAMA,YAAY,CAACC,OAAO,CAACJ,GAAG,EAAEC,KAAK,CAAC;MACtC;IACF,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,MAAMI,iBAAiB,GAAGV,qBAAqB,CAAC,CAAC;EACjD,IAAIU,iBAAiB,EAAE;IACrB,IAAI;MACF,MAAMA,iBAAiB,CAACN,aAAa,CAACC,GAAG,EAAEC,KAAK,CAAC;IACnD,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;AACF;AAEO,eAAeH,aAAaA,CAACE,GAAW,EAA0B;EACvE,MAAMG,YAAY,GAAGZ,gBAAgB,CAAC,CAAC;EACvC,IAAIY,YAAY,EAAE;IAChB,IAAI;MACF,MAAMG,GAAG,GAAG,MAAMH,YAAY,CAACT,OAAO,CAACM,GAAG,CAAC;MAC3C,IAAIM,GAAG,KAAK,IAAI,EAAE;QAChB,OAAOA,GAAG;MACZ;IACF,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,MAAMD,iBAAiB,GAAGV,qBAAqB,CAAC,CAAC;EACjD,IAAIU,iBAAiB,EAAE;IACrB,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMD,iBAAiB,CAACP,aAAa,CAACE,GAAG,CAAC;MACtD,IAAIM,GAAG,KAAK,IAAI,EAAE;QAChB,OAAOA,GAAG;MACZ;IACF,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,OAAOjB,WAAW,CAACkB,GAAG,CAACP,GAAG,CAAC,IAAI,IAAI;AACrC;AAEO,MAAMQ,IAAI,GAAAC,OAAA,CAAAD,IAAA,GAAG;EAClBE,WAAW,EAAE,0CAA0C;EACvDC,OAAO,EAAE,sCAAsC;EAC/CC,WAAW,EAAE,0CAA0C;EACvDC,WAAW,EAAE,0CAA0C;EACvDC,SAAS,EAAE,wCAAwC;EACnDC,YAAY,EAAE,2CAA2C;EACzDC,SAAS,EAAE,wCAAwC;EACnDC,UAAU,EAAE;AACd,CAAU","ignoreList":[]}
@@ -22,7 +22,9 @@ class CameraErrorBoundary extends Component {
22
22
  this.props.onCameraError(error.message || 'Camera failed to initialize.');
23
23
  }
24
24
  render() {
25
- if (this.state.hasError) return null;
25
+ if (this.state.hasError) {
26
+ return null;
27
+ }
26
28
  return this.props.children;
27
29
  }
28
30
  }
@@ -32,7 +34,7 @@ class CameraErrorBoundary extends Component {
32
34
  export function DevConnectQrScanner({
33
35
  visible,
34
36
  onClose,
35
- onScanHost
37
+ onScanTarget
36
38
  }) {
37
39
  const scannedRef = useRef(false);
38
40
  const [error, setError] = useState(null);
@@ -46,8 +48,12 @@ export function DevConnectQrScanner({
46
48
  }
47
49
  }, [visible]);
48
50
  const handleScanned = useCallback(rawValue => {
49
- if (scannedRef.current) return;
50
- if (typeof rawValue !== 'string') return;
51
+ if (scannedRef.current) {
52
+ return;
53
+ }
54
+ if (typeof rawValue !== 'string') {
55
+ return;
56
+ }
51
57
  const parsed = parseMetroQrPayload(rawValue);
52
58
  if (!parsed) {
53
59
  setError('QR code does not contain a supported Metro URL.');
@@ -55,9 +61,12 @@ export function DevConnectQrScanner({
55
61
  }
56
62
  scannedRef.current = true;
57
63
  setError(null);
58
- onScanHost(parsed.computerHost);
64
+ onScanTarget({
65
+ computerHost: parsed.computerHost,
66
+ metroPort: parsed.metroPort
67
+ });
59
68
  onClose();
60
- }, [onClose, onScanHost]);
69
+ }, [onClose, onScanTarget]);
61
70
  const handleCameraKitRead = useCallback(event => {
62
71
  handleScanned(event.nativeEvent?.codeStringValue ?? '');
63
72
  }, [handleScanned]);
@@ -67,7 +76,9 @@ export function DevConnectQrScanner({
67
76
  const handleCameraError = useCallback(_msg => {
68
77
  setCameraFailed(true);
69
78
  }, []);
70
- if (!visible || !scanner) return null;
79
+ if (!visible || !scanner) {
80
+ return null;
81
+ }
71
82
  return /*#__PURE__*/_jsx(Modal, {
72
83
  visible: visible,
73
84
  animationType: "slide",