Files
Fluxup_PAP/node_modules/react-native/ReactCommon/jsinspector-modern/InspectorPackagerConnectionImpl.h
2026-03-10 16:18:05 +00:00

123 lines
4.0 KiB
C++

/*
* 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 "InspectorInterfaces.h"
#include "InspectorPackagerConnection.h"
#include <folly/dynamic.h>
#include <unordered_map>
namespace facebook::react::jsinspector_modern {
/**
* Internals of InspectorPackagerConnection.
*/
class InspectorPackagerConnection::Impl : public IWebSocketDelegate,
public IPageStatusListener,
// Used to generate `weak_ptr`s we can pass around.
public std::enable_shared_from_this<InspectorPackagerConnection::Impl> {
public:
using SessionId = uint32_t;
/**
* Implements InspectorPackagerConnection's constructor.
*/
static std::shared_ptr<Impl> create(
std::string url,
std::string deviceName,
std::string appName,
std::unique_ptr<InspectorPackagerConnectionDelegate> delegate);
// InspectorPackagerConnection's public API
bool isConnected() const;
void connect();
void closeQuietly();
void sendEventToAllConnections(const std::string &event);
std::unique_ptr<ILocalConnection> removeConnectionForPage(const std::string &pageId);
/**
* Send a message to the packager as soon as possible. This method is safe
* to call from any thread. The connection may be closed before the message
* is sent, in which case the message will be dropped. The message is also
* dropped if the session is no longer valid.
*/
void scheduleSendToPackager(folly::dynamic message, SessionId sourceSessionId, const std::string &sourcePageId);
private:
struct Session {
std::unique_ptr<ILocalConnection> localConnection;
SessionId sessionId;
};
class RemoteConnection;
Impl(
std::string url,
std::string deviceName,
std::string appName,
std::unique_ptr<InspectorPackagerConnectionDelegate> delegate);
Impl(const Impl &) = delete;
Impl &operator=(const Impl &) = delete;
void handleDisconnect(const folly::const_dynamic_view &payload);
void handleConnect(const folly::const_dynamic_view &payload);
void handleWrappedEvent(const folly::const_dynamic_view &payload);
void handleProxyMessage(const folly::const_dynamic_view &message);
folly::dynamic pages();
void reconnect();
void closeAllConnections();
void disposeWebSocket();
void sendToPackager(const folly::dynamic &message);
void abort(std::optional<int> posixCode, const std::string &message, const std::string &cause);
// IWebSocketDelegate methods
virtual void didFailWithError(std::optional<int> posixCode, std::string error) override;
virtual void didReceiveMessage(std::string_view message) override;
virtual void didOpen() override;
virtual void didClose() override;
// IPageStatusListener methods
virtual void onPageRemoved(int pageId) override;
const std::string url_;
const std::string deviceName_;
const std::string appName_;
const std::unique_ptr<InspectorPackagerConnectionDelegate> delegate_;
std::unordered_map<std::string, Session> inspectorSessions_;
std::unique_ptr<IWebSocket> webSocket_;
bool connected_{false};
bool closed_{false};
bool suppressConnectionErrors_{false};
// Whether a reconnection is currently pending.
bool reconnectPending_{false};
SessionId nextSessionId_{1};
};
class InspectorPackagerConnection::Impl::RemoteConnection : public IRemoteConnection {
public:
RemoteConnection(
std::weak_ptr<InspectorPackagerConnection::Impl> owningPackagerConnection,
std::string pageId,
SessionId sessionId);
// IRemoteConnection methods
void onMessage(std::string message) override;
void onDisconnect() override;
private:
const std::weak_ptr<InspectorPackagerConnection::Impl> owningPackagerConnection_;
const std::string pageId_;
const SessionId sessionId_;
};
} // namespace facebook::react::jsinspector_modern