Skip to content

Commit c38db25

Browse files
vzaidmanfacebook-github-bot
authored andcommitted
expose if there are any connected devices to dev middleware and adding event on if this changes (facebook#54447)
Summary: Changelog: [Internal] Expose `unstable_hasConnectedDevices` and `unstable_addHasConnectedDevicesListener` from both `InspectorProxy` and `DevMiddleware` that tells the user if any devices are connected to `devMiddleware` and allows to listen to whenever this state changes. Reviewed By: motiz88 Differential Revision: D86319965
1 parent 0ee4a2d commit c38db25

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

packages/dev-middleware/src/createDevMiddleware.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010

1111
import type {CreateCustomMessageHandlerFn} from './inspector-proxy/CustomMessageHandler';
12+
import type {HasConnectedDevicesListener} from './inspector-proxy/InspectorProxy';
1213
import type {BrowserLauncher} from './types/BrowserLauncher';
1314
import type {EventReporter, ReportableEvent} from './types/EventReporter';
1415
import type {Experiments, ExperimentsConfig} from './types/Experiments';
@@ -73,6 +74,8 @@ type Options = $ReadOnly<{
7374
type DevMiddlewareAPI = $ReadOnly<{
7475
middleware: NextHandleFunction,
7576
websocketEndpoints: {[path: string]: ws$WebSocketServer},
77+
unstable_hasConnectedDevices(): boolean,
78+
unstable_addHasConnectedDevicesListener: HasConnectedDevicesListener,
7679
}>;
7780

7881
export default function createDevMiddleware({
@@ -131,6 +134,10 @@ export default function createDevMiddleware({
131134
return {
132135
middleware,
133136
websocketEndpoints: inspectorProxy.createWebSocketListeners(),
137+
unstable_hasConnectedDevices: () =>
138+
inspectorProxy.unstable_hasConnectedDevices(),
139+
unstable_addHasConnectedDevicesListener: cb =>
140+
inspectorProxy.unstable_addHasConnectedDevicesListener(cb),
134141
};
135142
}
136143

packages/dev-middleware/src/inspector-proxy/InspectorProxy.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ export interface InspectorProxyQueries {
7171
): Array<PageDescription>;
7272
}
7373

74+
export type RemoveHasConnectedDevicesListener = () => void;
75+
76+
export type HasConnectedDevicesListener = (
77+
callback: (hasConnectedDevices: boolean) => void,
78+
) => RemoveHasConnectedDevicesListener;
79+
7480
/**
7581
* Main Inspector Proxy class that connects JavaScript VM inside Android/iOS apps and JS debugger.
7682
*/
@@ -97,6 +103,8 @@ export default class InspectorProxy implements InspectorProxyQueries {
97103

98104
#eventLoopPerfTracker: EventLoopPerfTracker;
99105

106+
#onHasConnectedDevicesChangedFns: Set<(boolean) => void>;
107+
100108
constructor(
101109
serverBaseUrl: string,
102110
eventReporter: ?EventReporter,
@@ -111,6 +119,7 @@ export default class InspectorProxy implements InspectorProxyQueries {
111119
this.#experiments = experiments;
112120
this.#logger = logger;
113121
this.#customMessageHandler = customMessageHandler;
122+
this.#onHasConnectedDevicesChangedFns = new Set();
114123
if (trackEventLoopPerf) {
115124
this.#eventLoopPerfTracker = new EventLoopPerfTracker({
116125
perfMeasurementDuration: EVENT_LOOP_PERF_MEASUREMENT_MS,
@@ -142,6 +151,18 @@ export default class InspectorProxy implements InspectorProxyQueries {
142151
}
143152
}
144153

154+
unstable_hasConnectedDevices(): boolean {
155+
return this.#devices.size > 0;
156+
}
157+
158+
unstable_addHasConnectedDevicesListener: HasConnectedDevicesListener =
159+
onDevicesChanged => {
160+
this.#onHasConnectedDevicesChangedFns.add(onDevicesChanged);
161+
return () => {
162+
this.#onHasConnectedDevicesChangedFns.delete(onDevicesChanged);
163+
};
164+
};
165+
145166
getPageDescriptions({
146167
requestorRelativeBaseUrl,
147168
logNoPagesForConnectedDevice = false,
@@ -365,6 +386,9 @@ export default class InspectorProxy implements InspectorProxyQueries {
365386
}
366387

367388
this.#devices.set(deviceId, newDevice);
389+
if (this.#devices.size === 1) {
390+
this.#onHasConnectedDevicesChangedFns.forEach(cb => cb(true));
391+
}
368392

369393
debug(
370394
"Got new device connection: name='%s', app=%s, device=%s, via=%s",
@@ -457,6 +481,9 @@ export default class InspectorProxy implements InspectorProxyQueries {
457481

458482
if (this.#devices.get(deviceId)?.dangerouslyGetSocket() === socket) {
459483
this.#devices.delete(deviceId);
484+
if (this.#devices.size === 0) {
485+
this.#onHasConnectedDevicesChangedFns.forEach(cb => cb(false));
486+
}
460487
}
461488
});
462489
} catch (error) {

0 commit comments

Comments
 (0)