react-native-get-pixel_edit/node_modules/@react-native/dev-middleware/dist/middleware/openDebuggerMiddleware.js
2025-07-09 11:41:52 +09:00

137 lines
3.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = openDebuggerMiddleware;
var _url = _interopRequireDefault(require("url"));
var _getDevToolsFrontendUrl = _interopRequireDefault(
require("../utils/getDevToolsFrontendUrl")
);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
const debuggerInstances = new Map();
/**
* Open the JavaScript debugger for a given CDP target (direct Hermes debugging).
*
* Currently supports Hermes targets, opening debugger websocket URL in Chrome
* DevTools.
*
* @see https://chromedevtools.github.io/devtools-protocol/
*/
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 } = query;
const targets = inspectorProxy.getPageDescriptions().filter(
// Only use targets with better reloading support
(app) =>
app.title === "React Native Experimental (Improved Chrome Reloads)"
);
let target;
const launchType = req.method === "POST" ? "launch" : "redirect";
if (typeof appId === "string") {
logger?.info(
(launchType === "launch" ? "Launching" : "Redirecting to") +
" JS debugger (experimental)..."
);
target = targets.find((_target) => _target.description === appId);
} else {
logger?.info(
(launchType === "launch" ? "Launching" : "Redirecting to") +
" JS debugger for first available target..."
);
target = targets[0];
}
if (!target) {
res.writeHead(404);
res.end("Unable to find Chrome DevTools inspector target");
logger?.warn(
"No compatible apps connected. JavaScript debugging can only be used with the Hermes engine."
);
eventReporter?.logEvent({
type: "launch_debugger_frontend",
launchType,
status: "coded_error",
errorCode: "NO_APPS_FOUND",
});
return;
}
try {
switch (launchType) {
case "launch":
await debuggerInstances.get(appId)?.kill();
debuggerInstances.set(
appId,
await browserLauncher.launchDebuggerAppWindow(
(0, _getDevToolsFrontendUrl.default)(
experiments,
target.webSocketDebuggerUrl,
serverBaseUrl
)
)
);
res.end();
break;
case "redirect":
res.writeHead(302, {
Location: (0, _getDevToolsFrontendUrl.default)(
experiments,
target.webSocketDebuggerUrl,
// Use a relative URL.
""
),
});
res.end();
break;
default:
}
eventReporter?.logEvent({
type: "launch_debugger_frontend",
launchType,
status: "success",
appId,
});
return;
} catch (e) {
logger?.error(
"Error launching JS debugger: " + e.message ?? "Unknown error"
);
res.writeHead(500);
res.end();
eventReporter?.logEvent({
type: "launch_debugger_frontend",
launchType,
status: "error",
error: e,
});
return;
}
}
next();
};
}