/* * 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. */ #pragma once #include #include #include #include #include #include #include #include #include namespace facebook { namespace hermes { namespace inspector { namespace chrome { namespace message { std::string stripCachePrevention(const std::string &url); template void setHermesLocation( facebook::hermes::debugger::SourceLocation &hermesLoc, const T &chromeLoc, const std::vector &parsedScripts) { hermesLoc.line = chromeLoc.lineNumber + 1; if (chromeLoc.columnNumber.has_value()) { if (chromeLoc.columnNumber.value() == 0) { // TODO: When CDTP sends a column number of 0, we send Hermes a column // number of 1. For some reason, this causes Hermes to not be // able to resolve breakpoints. hermesLoc.column = ::facebook::hermes::debugger::kInvalidLocation; } else { hermesLoc.column = chromeLoc.columnNumber.value() + 1; } } if (chromeLoc.url.has_value()) { hermesLoc.fileName = stripCachePrevention(chromeLoc.url.value()); } else if (chromeLoc.urlRegex.has_value()) { const std::regex regex(stripCachePrevention(chromeLoc.urlRegex.value())); auto it = parsedScripts.rbegin(); // We currently only support one physical breakpoint per location, so // search backwards so that we find the latest matching file. while (it != parsedScripts.rend()) { if (std::regex_match(*it, regex)) { hermesLoc.fileName = *it; break; } it++; } } } template void setChromeLocation( T &chromeLoc, const facebook::hermes::debugger::SourceLocation &hermesLoc) { if (hermesLoc.line != facebook::hermes::debugger::kInvalidLocation) { chromeLoc.lineNumber = hermesLoc.line - 1; } if (hermesLoc.column != facebook::hermes::debugger::kInvalidLocation) { chromeLoc.columnNumber = hermesLoc.column - 1; } } /// ErrorCode magic numbers match JSC's (see InspectorBackendDispatcher.cpp) enum class ErrorCode { ParseError = -32700, InvalidRequest = -32600, MethodNotFound = -32601, InvalidParams = -32602, InternalError = -32603, ServerError = -32000 }; ErrorResponse makeErrorResponse(int id, ErrorCode code, const std::string &message); OkResponse makeOkResponse(int id); namespace debugger { Location makeLocation(const facebook::hermes::debugger::SourceLocation &loc); CallFrame makeCallFrame( uint32_t callFrameIndex, const facebook::hermes::debugger::CallFrameInfo &callFrameInfo, const facebook::hermes::debugger::LexicalInfo &lexicalInfo, facebook::hermes::inspector::chrome::RemoteObjectsTable &objTable, jsi::Runtime &runtime, const facebook::hermes::debugger::ProgramState &state); std::vector makeCallFrames( const facebook::hermes::debugger::ProgramState &state, facebook::hermes::inspector::chrome::RemoteObjectsTable &objTable, jsi::Runtime &runtime); } // namespace debugger namespace runtime { CallFrame makeCallFrame(const facebook::hermes::debugger::CallFrameInfo &info); std::vector makeCallFrames( const facebook::hermes::debugger::StackTrace &stackTrace); ExceptionDetails makeExceptionDetails( const facebook::hermes::debugger::ExceptionDetails &details); RemoteObject makeRemoteObject( facebook::jsi::Runtime &runtime, const facebook::jsi::Value &value, facebook::hermes::inspector::chrome::RemoteObjectsTable &objTable, const std::string &objectGroup, bool byValue = false); } // namespace runtime } // namespace message } // namespace chrome } // namespace inspector } // namespace hermes } // namespace facebook