diff --git a/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js b/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js index 584907dc3ce..3ff3687647a 100644 --- a/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js +++ b/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js @@ -45,12 +45,19 @@ const DEBUGGER_HEARTBEAT_INTERVAL_MS = 10000; const INTERNAL_ERROR_CODE = 1011; +export type GetPageDescriptionsConfig = { + requestorRelativeBaseUrl: URL, + logNoPagesForConnectedDevice?: boolean, +}; + export interface InspectorProxyQueries { /** * Returns list of page descriptions ordered by device connection order, then * page addition order. */ - getPageDescriptions(requestorRelativeBaseUrl: URL): Array; + getPageDescriptions( + config: GetPageDescriptionsConfig, + ): Array; } /** @@ -95,22 +102,40 @@ export default class InspectorProxy implements InspectorProxyQueries { this.#customMessageHandler = customMessageHandler; } - getPageDescriptions(requestorRelativeBaseUrl: URL): Array { + getPageDescriptions({ + requestorRelativeBaseUrl, + logNoPagesForConnectedDevice = false, + }: GetPageDescriptionsConfig): Array { // Build list of pages from all devices. let result: Array = []; Array.from(this.#devices.entries()).forEach(([deviceId, device]) => { - result = result.concat( - device - .getPagesList() - .map((page: Page) => - this.#buildPageDescription( - deviceId, - device, - page, - requestorRelativeBaseUrl, - ), + const devicePages = device + .getPagesList() + .map((page: Page) => + this.#buildPageDescription( + deviceId, + device, + page, + requestorRelativeBaseUrl, ), - ); + ); + + if ( + logNoPagesForConnectedDevice && + devicePages.length === 0 && + device.dangerouslyGetSocket()?.readyState === WS.OPEN + ) { + this.#logger?.warn( + `Waiting for a DevTools connection to app '%s' on device '%s'. If no connection occurs, try: + - Restart the app + - Ensure a stable connection to the device + - Ensure that the app is built in a mode that supports debugging`, + device.getApp(), + device.getName(), + ); + } + + result = result.concat(devicePages); }); return result; } @@ -131,9 +156,11 @@ export default class InspectorProxy implements InspectorProxyQueries { ) { this.#sendJsonResponse( response, - this.getPageDescriptions( - getBaseUrlFromRequest(request) ?? this.#serverBaseUrl, - ), + this.getPageDescriptions({ + requestorRelativeBaseUrl: + getBaseUrlFromRequest(request) ?? this.#serverBaseUrl, + logNoPagesForConnectedDevice: true, + }), ); } else if (pathname === PAGES_LIST_JSON_VERSION_URL) { this.#sendJsonResponse(response, { diff --git a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js index 8b48ef811ee..7061abbbcbc 100644 --- a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js +++ b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js @@ -73,13 +73,23 @@ export default function openDebuggerMiddleware({ } = query; const targets = inspectorProxy - .getPageDescriptions(new URL(serverBaseUrl)) - .filter( - // Only use targets with better reloading support - app => + .getPageDescriptions({requestorRelativeBaseUrl: new URL(serverBaseUrl)}) + .filter(app => { + const betterReloadingSupport = app.title === LEGACY_SYNTHETIC_PAGE_TITLE || - app.reactNative.capabilities?.nativePageReloads === true, - ); + app.reactNative.capabilities?.nativePageReloads === true; + + if (!betterReloadingSupport) { + logger?.warn( + "Ignoring DevTools app debug target for '%s' with title '%s' and 'nativePageReloads' capability set to '%s'. ", + app.appId, + app.title, + String(app.reactNative.capabilities?.nativePageReloads), + ); + } + + return betterReloadingSupport; + }); let target;