UNPKG

@expo/cli

Version:
123 lines (122 loc) 4.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { openJsInspector: function() { return openJsInspector; }, promptInspectorAppAsync: function() { return promptInspectorAppAsync; }, queryAllInspectorAppsAsync: function() { return queryAllInspectorAppsAsync; }, queryInspectorAppAsync: function() { return queryInspectorAppAsync; } }); function _chalk() { const data = /*#__PURE__*/ _interop_require_default(require("chalk")); _chalk = function() { return data; }; return data; } const _CdpClient = require("./CdpClient"); const _prompts = require("../../../../utils/prompts"); const _pageIsSupported = require("../../metro/debugging/pageIsSupported"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const debug = require('debug')('expo:start:server:middleware:inspector:jsInspector'); async function openJsInspector(metroBaseUrl, app) { var _app_reactNative; if (!((_app_reactNative = app.reactNative) == null ? void 0 : _app_reactNative.logicalDeviceId)) { debug('Failed to open React Native DevTools, target is missing device ID'); return false; } const url = new URL('/open-debugger', metroBaseUrl); url.searchParams.set('target', app.id); // Request to open the React Native DevTools, but limit it to 1s // This is a workaround as this endpoint might not respond on some devices const response = await fetch(url, { method: 'POST', signal: AbortSignal.timeout(1000) }).catch((error)=>{ // Only swallow timeout errors if (error.name === 'TimeoutError') { return null; } throw error; }); if (!response) { debug(`No response received from the React Native DevTools.`); } else if (response.ok === false) { debug('Failed to open React Native DevTools, received response:', response.status); } return (response == null ? void 0 : response.ok) ?? true; } async function queryInspectorAppAsync(metroServerOrigin, appId) { const apps = await queryAllInspectorAppsAsync(metroServerOrigin); return apps.find((app)=>app.appId === appId) ?? null; } async function queryAllInspectorAppsAsync(metroServerOrigin) { const resp = await fetch(`${metroServerOrigin}/json/list`); // The newest runtime will be at the end of the list, // reversing the result would save time from try-error. const apps = (await resp.json()).reverse(); const results = []; for (const app of apps){ // Only use targets with better reloading support if (!(0, _pageIsSupported.pageIsSupported)(app)) { continue; } try { // Hide targets that are marked as hidden from the inspector, e.g. instances from expo-dev-menu and expo-dev-launcher. if (await appShouldBeIgnoredAsync(app)) { continue; } } catch (e) { // If we can't evaluate the JS, we just ignore the error and skips the target. debug(`Can't evaluate the JS on the app:`, JSON.stringify(e, null, 2)); continue; } results.push(app); } return results; } async function promptInspectorAppAsync(apps) { var _choices_find; if (apps.length === 1) { return apps[0]; } // Check if multiple devices are connected with the same device names // In this case, append the actual app id (device ID + page number) to the prompt const hasDuplicateNames = apps.some((app, index)=>index !== apps.findIndex((other)=>app.deviceName === other.deviceName)); const choices = apps.map((app)=>{ const name = app.deviceName ?? 'Unknown device'; return { title: hasDuplicateNames ? (0, _chalk().default)`${name}{dim - ${app.id}}` : name, value: app.id, app }; }); const value = await (0, _prompts.selectAsync)((0, _chalk().default)`Debug target {dim (Hermes only)}`, choices); return (_choices_find = choices.find((item)=>item.value === value)) == null ? void 0 : _choices_find.app; } const HIDE_FROM_INSPECTOR_ENV = 'globalThis.__expo_hide_from_inspector__'; async function appShouldBeIgnoredAsync(app) { const hideFromInspector = await (0, _CdpClient.evaluateJsFromCdpAsync)(app.webSocketDebuggerUrl, HIDE_FROM_INSPECTOR_ENV); debug(`[appShouldBeIgnoredAsync] webSocketDebuggerUrl[${app.webSocketDebuggerUrl}] hideFromInspector[${hideFromInspector}]`); return hideFromInspector !== undefined; } //# sourceMappingURL=JsInspector.js.map