Summary: For C++, folly::dynamic is used throughout. On iOS and Android though, Flipper goes through multiple conversions to get to a folly::dynamic only to ultimately obtain a JSON string from it. Let's take a look at Android: There are multiple types like FlipperObject, FlipperArray that wrap around a JSONObject. When data needs to be sent: 1. The JSONObject is asked for its string representation. 2. The string representation is then parsed by folly to construct the folly::dynamic instance. 3. The step above involves an extra boundary cross through JNI. 4. Ultimately, a socket or ws connection does not understand folly::dynamic so we then get a JSON string representation from it. 5. Data is sent. As described above, for big enough objects, this represents an issue. So, the idea of this change, is to allow plugins to send a JSON string instead. This will remove a few serialisation/deserialisation steps from the process. *Note: this API is not currently used by anything so there's no impact to existing plugins.* Changelog: expose a send method that accept a string as params Reviewed By: LukeDefeo Differential Revision: D38741582 fbshipit-source-id: 78e0acd80fc8c97378ee986cbaf377078996ed60
98 lines
2.5 KiB
C++
98 lines
2.5 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 <mutex>
|
|
#include "FlipperConnectionManager.h"
|
|
#include "FlipperInitConfig.h"
|
|
#include "FlipperScheduler.h"
|
|
#include "FlipperSocket.h"
|
|
#include "FlipperState.h"
|
|
|
|
namespace facebook {
|
|
namespace flipper {
|
|
|
|
class ConnectionEvents;
|
|
class ConnectionContextStore;
|
|
class FlipperRSocketResponder;
|
|
class FlipperConnectionManagerWrapper;
|
|
class FlipperConnectionManagerImpl : public FlipperConnectionManager {
|
|
friend ConnectionEvents;
|
|
|
|
public:
|
|
FlipperConnectionManagerImpl(
|
|
FlipperInitConfig config,
|
|
std::shared_ptr<FlipperState> state,
|
|
std::shared_ptr<ConnectionContextStore> contextStore);
|
|
|
|
~FlipperConnectionManagerImpl();
|
|
|
|
void start() override;
|
|
|
|
void stop() override;
|
|
|
|
bool isOpen() const override;
|
|
|
|
void setCallbacks(Callbacks* callbacks) override;
|
|
|
|
void sendMessage(const folly::dynamic& message) override;
|
|
|
|
void sendMessage(const std::string& message) override;
|
|
|
|
void onMessageReceived(
|
|
const folly::dynamic& message,
|
|
std::unique_ptr<FlipperResponder> responder) override;
|
|
|
|
void reconnect();
|
|
void setCertificateProvider(
|
|
const std::shared_ptr<FlipperCertificateProvider> provider) override;
|
|
std::shared_ptr<FlipperCertificateProvider> getCertificateProvider() override;
|
|
|
|
private:
|
|
bool isOpen_ = false;
|
|
bool isStarted_ = false;
|
|
std::shared_ptr<FlipperCertificateProvider> certProvider_ = nullptr;
|
|
Callbacks* callbacks_;
|
|
DeviceData deviceData_;
|
|
std::shared_ptr<FlipperState> flipperState_;
|
|
int insecurePort;
|
|
int securePort;
|
|
int altInsecurePort;
|
|
int altSecurePort;
|
|
|
|
Scheduler* flipperScheduler_;
|
|
Scheduler* connectionScheduler_;
|
|
|
|
std::unique_ptr<FlipperSocket> client_;
|
|
|
|
bool connectionIsTrusted_;
|
|
bool certificateExchangeCompleted_ = false;
|
|
|
|
int failedConnectionAttempts_ = 0;
|
|
int failedSocketConnectionAttempts = 0;
|
|
|
|
std::shared_ptr<ConnectionContextStore> contextStore_;
|
|
std::shared_ptr<FlipperConnectionManagerWrapper> implWrapper_;
|
|
|
|
void startSync();
|
|
bool connectAndExchangeCertificate();
|
|
bool connectSecurely();
|
|
bool isCertificateExchangeNeeded();
|
|
void requestSignedCertificate();
|
|
void processSignedCertificateResponse(
|
|
std::shared_ptr<FlipperStep> gettingCertificateStep,
|
|
std::string response,
|
|
bool isError);
|
|
bool isRunningInOwnThread();
|
|
void reevaluateSocketProvider();
|
|
std::string getDeviceId();
|
|
};
|
|
|
|
} // namespace flipper
|
|
} // namespace facebook
|