Files
flipper/xplat/Flipper/FlipperConnectionManager.h
Lorenzo Blasa c2ed2484d9 Expose a send method with a string params
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
2022-08-17 09:18:20 -07:00

92 lines
2.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 <folly/json.h>
#include "FlipperCertificateProvider.h"
#include "FlipperResponder.h"
namespace facebook {
namespace flipper {
class FlipperConnectionManager {
public:
class Callbacks;
public:
virtual ~FlipperConnectionManager(){};
/**
Establishes a connection to the ws server.
*/
virtual void start() = 0;
/**
Closes an open connection to the ws server.
*/
virtual void stop() = 0;
/**
Sets the Auth token to be used for hitting an Intern end point
*/
virtual void setCertificateProvider(
const std::shared_ptr<FlipperCertificateProvider> provider) = 0;
/**
Gets the certificate provider
*/
virtual std::shared_ptr<FlipperCertificateProvider>
getCertificateProvider() = 0;
/**
True if there's an open connection.
This method may block if the connection is busy.
*/
virtual bool isOpen() const = 0;
/**
Send message to the ws server.
*/
virtual void sendMessage(const folly::dynamic& message) = 0;
/**
Send message to the ws server.
Note: The `message` argument is expected to contain a valid JSON.
*/
virtual void sendMessage(const std::string& message) = 0;
/**
Handler for connection and message receipt from the ws server.
The callbacks should be set before a connection is established.
*/
virtual void setCallbacks(Callbacks* callbacks) = 0;
/**
Called by ws server when a message has been received.
*/
virtual void onMessageReceived(
const folly::dynamic& message,
std::unique_ptr<FlipperResponder> responder) = 0;
};
class FlipperConnectionManager::Callbacks {
public:
virtual ~Callbacks(){};
virtual void onConnected() = 0;
virtual void onDisconnected() = 0;
virtual void onMessageReceived(
const folly::dynamic& message,
std::unique_ptr<FlipperResponder>) = 0;
};
} // namespace flipper
} // namespace facebook