146 lines
4.4 KiB
JavaScript
146 lines
4.4 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true,
|
||
|
});
|
||
|
exports.default = openDebuggerMiddleware;
|
||
|
var _getDevToolsFrontendUrl = _interopRequireDefault(
|
||
|
require("../utils/getDevToolsFrontendUrl")
|
||
|
);
|
||
|
var _url = _interopRequireDefault(require("url"));
|
||
|
function _interopRequireDefault(e) {
|
||
|
return e && e.__esModule ? e : { default: e };
|
||
|
}
|
||
|
const LEGACY_SYNTHETIC_PAGE_TITLE =
|
||
|
"React Native Experimental (Improved Chrome Reloads)";
|
||
|
function openDebuggerMiddleware({
|
||
|
serverBaseUrl,
|
||
|
logger,
|
||
|
browserLauncher,
|
||
|
eventReporter,
|
||
|
experiments,
|
||
|
inspectorProxy,
|
||
|
}) {
|
||
|
return async (req, res, next) => {
|
||
|
if (
|
||
|
req.method === "POST" ||
|
||
|
(experiments.enableOpenDebuggerRedirect && req.method === "GET")
|
||
|
) {
|
||
|
const { query } = _url.default.parse(req.url, true);
|
||
|
const { appId, device, launchId, target: targetId } = query;
|
||
|
const targets = inspectorProxy
|
||
|
.getPageDescriptions(new URL(serverBaseUrl))
|
||
|
.filter(
|
||
|
(app) =>
|
||
|
app.title === LEGACY_SYNTHETIC_PAGE_TITLE ||
|
||
|
app.reactNative.capabilities?.nativePageReloads === true
|
||
|
);
|
||
|
let target;
|
||
|
const launchType = req.method === "POST" ? "launch" : "redirect";
|
||
|
if (
|
||
|
typeof targetId === "string" ||
|
||
|
typeof appId === "string" ||
|
||
|
typeof device === "string"
|
||
|
) {
|
||
|
logger?.info(
|
||
|
(launchType === "launch" ? "Launching" : "Redirecting to") +
|
||
|
" DevTools..."
|
||
|
);
|
||
|
target = targets.find(
|
||
|
(_target) =>
|
||
|
(targetId == null || _target.id === targetId) &&
|
||
|
(appId == null ||
|
||
|
(_target.appId === appId &&
|
||
|
_target.title === LEGACY_SYNTHETIC_PAGE_TITLE)) &&
|
||
|
(device == null || _target.reactNative.logicalDeviceId === device)
|
||
|
);
|
||
|
} else if (targets.length > 0) {
|
||
|
logger?.info(
|
||
|
(launchType === "launch" ? "Launching" : "Redirecting to") +
|
||
|
` DevTools${
|
||
|
targets.length === 1 ? "" : " for most recently connected target"
|
||
|
}...`
|
||
|
);
|
||
|
target = targets[targets.length - 1];
|
||
|
}
|
||
|
if (!target) {
|
||
|
res.writeHead(404);
|
||
|
res.end("Unable to find debugger target");
|
||
|
logger?.warn(
|
||
|
"No compatible apps connected. React Native DevTools can only be used with the Hermes engine."
|
||
|
);
|
||
|
eventReporter?.logEvent({
|
||
|
type: "launch_debugger_frontend",
|
||
|
launchType,
|
||
|
status: "coded_error",
|
||
|
errorCode: "NO_APPS_FOUND",
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
const useFuseboxEntryPoint =
|
||
|
target.reactNative.capabilities?.prefersFuseboxFrontend;
|
||
|
try {
|
||
|
switch (launchType) {
|
||
|
case "launch":
|
||
|
await browserLauncher.launchDebuggerAppWindow(
|
||
|
(0, _getDevToolsFrontendUrl.default)(
|
||
|
experiments,
|
||
|
target.webSocketDebuggerUrl,
|
||
|
serverBaseUrl,
|
||
|
{
|
||
|
launchId,
|
||
|
useFuseboxEntryPoint,
|
||
|
}
|
||
|
)
|
||
|
);
|
||
|
res.writeHead(200);
|
||
|
res.end();
|
||
|
break;
|
||
|
case "redirect":
|
||
|
res.writeHead(302, {
|
||
|
Location: (0, _getDevToolsFrontendUrl.default)(
|
||
|
experiments,
|
||
|
target.webSocketDebuggerUrl,
|
||
|
serverBaseUrl,
|
||
|
{
|
||
|
relative: true,
|
||
|
launchId,
|
||
|
useFuseboxEntryPoint,
|
||
|
}
|
||
|
),
|
||
|
});
|
||
|
res.end();
|
||
|
break;
|
||
|
default:
|
||
|
}
|
||
|
eventReporter?.logEvent({
|
||
|
type: "launch_debugger_frontend",
|
||
|
launchType,
|
||
|
status: "success",
|
||
|
appId: appId ?? null,
|
||
|
deviceId: device ?? null,
|
||
|
resolvedTargetDescription: target.description,
|
||
|
resolvedTargetAppId: target.appId,
|
||
|
prefersFuseboxFrontend: useFuseboxEntryPoint ?? false,
|
||
|
});
|
||
|
return;
|
||
|
} catch (e) {
|
||
|
logger?.error(
|
||
|
"Error launching DevTools: " + e.message ?? "Unknown error"
|
||
|
);
|
||
|
res.writeHead(500);
|
||
|
res.end();
|
||
|
eventReporter?.logEvent({
|
||
|
type: "launch_debugger_frontend",
|
||
|
launchType,
|
||
|
status: "error",
|
||
|
error: e,
|
||
|
prefersFuseboxFrontend: useFuseboxEntryPoint ?? false,
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
next();
|
||
|
};
|
||
|
}
|