@react-native/dev-middleware 0.84.0-nightly-20251210-3e9083b42 → 0.84.0-nightly-20251211-80e384a80

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.
@@ -9,6 +9,7 @@
9
9
  */
10
10
 
11
11
  import type { CreateCustomMessageHandlerFn } from "./inspector-proxy/CustomMessageHandler";
12
+ import type { HasConnectedDevicesListener } from "./inspector-proxy/InspectorProxy";
12
13
  import type { BrowserLauncher } from "./types/BrowserLauncher";
13
14
  import type { EventReporter } from "./types/EventReporter";
14
15
  import type { ExperimentsConfig } from "./types/Experiments";
@@ -57,6 +58,8 @@ type Options = Readonly<{
57
58
  type DevMiddlewareAPI = Readonly<{
58
59
  middleware: NextHandleFunction;
59
60
  websocketEndpoints: { [path: string]: ws$WebSocketServer };
61
+ unstable_hasConnectedDevices(): boolean;
62
+ unstable_addHasConnectedDevicesListener: HasConnectedDevicesListener;
60
63
  }>;
61
64
  declare function createDevMiddleware($$PARAM_0$$: Options): DevMiddlewareAPI;
62
65
  export default createDevMiddleware;
@@ -74,6 +74,10 @@ function createDevMiddleware({
74
74
  return {
75
75
  middleware,
76
76
  websocketEndpoints: inspectorProxy.createWebSocketListeners(),
77
+ unstable_hasConnectedDevices: () =>
78
+ inspectorProxy.unstable_hasConnectedDevices(),
79
+ unstable_addHasConnectedDevicesListener: (cb) =>
80
+ inspectorProxy.unstable_addHasConnectedDevicesListener(cb),
77
81
  };
78
82
  }
79
83
  function getExperiments(config) {
@@ -9,6 +9,7 @@
9
9
  */
10
10
 
11
11
  import type { CreateCustomMessageHandlerFn } from "./inspector-proxy/CustomMessageHandler";
12
+ import type { HasConnectedDevicesListener } from "./inspector-proxy/InspectorProxy";
12
13
  import type { BrowserLauncher } from "./types/BrowserLauncher";
13
14
  import type { EventReporter } from "./types/EventReporter";
14
15
  import type { ExperimentsConfig } from "./types/Experiments";
@@ -65,6 +66,8 @@ type Options = $ReadOnly<{
65
66
  type DevMiddlewareAPI = $ReadOnly<{
66
67
  middleware: NextHandleFunction,
67
68
  websocketEndpoints: { [path: string]: ws$WebSocketServer },
69
+ unstable_hasConnectedDevices(): boolean,
70
+ unstable_addHasConnectedDevicesListener: HasConnectedDevicesListener,
68
71
  }>;
69
72
 
70
73
  declare export default function createDevMiddleware(
@@ -28,6 +28,10 @@ export interface InspectorProxyQueries {
28
28
  config: GetPageDescriptionsConfig,
29
29
  ): Array<PageDescription>;
30
30
  }
31
+ export type RemoveHasConnectedDevicesListener = () => void;
32
+ export type HasConnectedDevicesListener = (
33
+ callback: (hasConnectedDevices: boolean) => void,
34
+ ) => RemoveHasConnectedDevicesListener;
31
35
  /**
32
36
  * Main Inspector Proxy class that connects JavaScript VM inside Android/iOS apps and JS debugger.
33
37
  */
@@ -40,6 +44,8 @@ declare class InspectorProxy implements InspectorProxyQueries {
40
44
  customMessageHandler: null | undefined | CreateCustomMessageHandlerFn,
41
45
  trackEventLoopPerf?: boolean,
42
46
  );
47
+ unstable_hasConnectedDevices(): boolean;
48
+ unstable_addHasConnectedDevicesListener: HasConnectedDevicesListener;
43
49
  getPageDescriptions(
44
50
  $$PARAM_0$$: GetPageDescriptionsConfig,
45
51
  ): Array<PageDescription>;
@@ -51,6 +51,7 @@ class InspectorProxy {
51
51
  #logger;
52
52
  #lastMessageTimestamp = null;
53
53
  #eventLoopPerfTracker;
54
+ #onHasConnectedDevicesChangedFns;
54
55
  constructor(
55
56
  serverBaseUrl,
56
57
  eventReporter,
@@ -65,6 +66,7 @@ class InspectorProxy {
65
66
  this.#experiments = experiments;
66
67
  this.#logger = logger;
67
68
  this.#customMessageHandler = customMessageHandler;
69
+ this.#onHasConnectedDevicesChangedFns = new Set();
68
70
  if (trackEventLoopPerf) {
69
71
  this.#eventLoopPerfTracker = new _EventLoopPerfTracker.default({
70
72
  perfMeasurementDuration: EVENT_LOOP_PERF_MEASUREMENT_MS,
@@ -94,6 +96,15 @@ class InspectorProxy {
94
96
  });
95
97
  }
96
98
  }
99
+ unstable_hasConnectedDevices() {
100
+ return this.#devices.size > 0;
101
+ }
102
+ unstable_addHasConnectedDevicesListener = (onDevicesChanged) => {
103
+ this.#onHasConnectedDevicesChangedFns.add(onDevicesChanged);
104
+ return () => {
105
+ this.#onHasConnectedDevicesChangedFns.delete(onDevicesChanged);
106
+ };
107
+ };
97
108
  getPageDescriptions({
98
109
  requestorRelativeBaseUrl,
99
110
  logNoPagesForConnectedDevice = false,
@@ -266,6 +277,9 @@ class InspectorProxy {
266
277
  newDevice = new _Device.default(deviceOptions);
267
278
  }
268
279
  this.#devices.set(deviceId, newDevice);
280
+ if (this.#devices.size === 1) {
281
+ this.#onHasConnectedDevicesChangedFns.forEach((cb) => cb(true));
282
+ }
269
283
  debug(
270
284
  "Got new device connection: name='%s', app=%s, device=%s, via=%s",
271
285
  deviceName,
@@ -342,6 +356,9 @@ class InspectorProxy {
342
356
  });
343
357
  if (this.#devices.get(deviceId)?.dangerouslyGetSocket() === socket) {
344
358
  this.#devices.delete(deviceId);
359
+ if (this.#devices.size === 0) {
360
+ this.#onHasConnectedDevicesChangedFns.forEach((cb) => cb(false));
361
+ }
345
362
  }
346
363
  });
347
364
  } catch (error) {
@@ -32,6 +32,12 @@ export interface InspectorProxyQueries {
32
32
  ): Array<PageDescription>;
33
33
  }
34
34
 
35
+ export type RemoveHasConnectedDevicesListener = () => void;
36
+
37
+ export type HasConnectedDevicesListener = (
38
+ callback: (hasConnectedDevices: boolean) => void,
39
+ ) => RemoveHasConnectedDevicesListener;
40
+
35
41
  /**
36
42
  * Main Inspector Proxy class that connects JavaScript VM inside Android/iOS apps and JS debugger.
37
43
  */
@@ -44,6 +50,8 @@ declare export default class InspectorProxy implements InspectorProxyQueries {
44
50
  customMessageHandler: ?CreateCustomMessageHandlerFn,
45
51
  trackEventLoopPerf?: boolean,
46
52
  ): void;
53
+ unstable_hasConnectedDevices(): boolean;
54
+ unstable_addHasConnectedDevicesListener: HasConnectedDevicesListener;
47
55
  getPageDescriptions(
48
56
  $$PARAM_0$$: GetPageDescriptionsConfig,
49
57
  ): Array<PageDescription>;
@@ -20,7 +20,9 @@ declare const DefaultBrowserLauncher: {
20
20
  */
21
21
  launchDebuggerAppWindow: (url: string) => Promise<void>;
22
22
  unstable_showFuseboxShell(url: string, windowKey: string): Promise<void>;
23
- unstable_prepareFuseboxShell(): Promise<DebuggerShellPreparationResult>;
23
+ unstable_prepareFuseboxShell(
24
+ prebuiltBinaryPath?: null | undefined | string,
25
+ ): Promise<DebuggerShellPreparationResult>;
24
26
  };
25
27
  declare const $$EXPORT_DEFAULT_DECLARATION$$: typeof DefaultBrowserLauncher;
26
28
  declare type $$EXPORT_DEFAULT_DECLARATION$$ =
@@ -45,18 +45,13 @@ const DefaultBrowserLauncher = {
45
45
  });
46
46
  },
47
47
  async unstable_showFuseboxShell(url, windowKey) {
48
- return await unstable_spawnDebuggerShellWithArgs(
49
- ["--frontendUrl=" + url, "--windowKey=" + windowKey],
50
- {
51
- mode: "detached",
52
- flavor: process.env.RNDT_DEV === "1" ? "dev" : "prebuilt",
53
- },
54
- );
48
+ return await unstable_spawnDebuggerShellWithArgs([
49
+ "--frontendUrl=" + url,
50
+ "--windowKey=" + windowKey,
51
+ ]);
55
52
  },
56
- async unstable_prepareFuseboxShell() {
57
- return await unstable_prepareDebuggerShell(
58
- process.env.RNDT_DEV === "1" ? "dev" : "prebuilt",
59
- );
53
+ async unstable_prepareFuseboxShell(prebuiltBinaryPath) {
54
+ return await unstable_prepareDebuggerShell();
60
55
  },
61
56
  };
62
57
  var _default = (exports.default = DefaultBrowserLauncher);
@@ -21,7 +21,9 @@ declare const DefaultBrowserLauncher: {
21
21
  */
22
22
  launchDebuggerAppWindow: (url: string) => Promise<void>,
23
23
  unstable_showFuseboxShell(url: string, windowKey: string): Promise<void>,
24
- unstable_prepareFuseboxShell(): Promise<DebuggerShellPreparationResult>,
24
+ unstable_prepareFuseboxShell(
25
+ prebuiltBinaryPath?: ?string,
26
+ ): Promise<DebuggerShellPreparationResult>,
25
27
  };
26
28
 
27
29
  declare export default typeof DefaultBrowserLauncher;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native/dev-middleware",
3
- "version": "0.84.0-nightly-20251210-3e9083b42",
3
+ "version": "0.84.0-nightly-20251211-80e384a80",
4
4
  "description": "Dev server middleware for React Native",
5
5
  "keywords": [
6
6
  "react-native",
@@ -23,8 +23,8 @@
23
23
  ],
24
24
  "dependencies": {
25
25
  "@isaacs/ttlcache": "^1.4.1",
26
- "@react-native/debugger-frontend": "0.84.0-nightly-20251210-3e9083b42",
27
- "@react-native/debugger-shell": "0.84.0-nightly-20251210-3e9083b42",
26
+ "@react-native/debugger-frontend": "0.84.0-nightly-20251211-80e384a80",
27
+ "@react-native/debugger-shell": "0.84.0-nightly-20251211-80e384a80",
28
28
  "chrome-launcher": "^0.15.2",
29
29
  "chromium-edge-launcher": "^0.2.0",
30
30
  "connect": "^3.6.5",
@@ -39,7 +39,7 @@
39
39
  "node": ">= 20.19.4"
40
40
  },
41
41
  "devDependencies": {
42
- "@react-native/debugger-shell": "0.84.0-nightly-20251210-3e9083b42",
42
+ "@react-native/debugger-shell": "0.84.0-nightly-20251211-80e384a80",
43
43
  "selfsigned": "^4.0.0",
44
44
  "undici": "^5.29.0",
45
45
  "wait-for-expect": "^3.0.2"