Rocket.Chat.ReactNative/ios/Pods/Flipper-RSocket/rsocket/DuplexConnection.h

64 lines
2.3 KiB
C++

// Copyright (c) Facebook, Inc. and its affiliates.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <memory>
#include <folly/io/IOBuf.h>
#include "yarpl/flowable/Subscriber.h"
namespace rsocket {
/// Represents a connection of the underlying protocol, on top of which the
/// RSocket protocol is layered. The underlying protocol MUST provide an
/// ordered, guaranteed, bidirectional transport of frames. Moreover, frame
/// boundaries MUST be preserved.
///
/// The frames exchanged through this interface are serialized, and lack the
/// optional frame length field. Presence of the field is determined by the
/// underlying protocol. If the protocol natively supports framing
/// (e.g. Aeron), the fileld MUST be omitted, otherwise (e.g. TCP) it must be
/// present. The RSocket implementation MUST NOT be provided with a frame that
/// contains the length field nor can it ever send such a frame.
///
/// It can be assumed that both input and output will be closed by sending
/// appropriate terminal signals (according to ReactiveStreams specification)
/// before the connection is destroyed.
class DuplexConnection {
public:
using Subscriber = yarpl::flowable::Subscriber<std::unique_ptr<folly::IOBuf>>;
virtual ~DuplexConnection() = default;
/// Sets a Subscriber that will consume received frames (a reader).
///
/// If setInput() has already been called, then calling setInput() again will
/// complete the previous subscriber.
virtual void setInput(std::shared_ptr<Subscriber>) = 0;
/// Write a serialized frame to the connection.
///
/// Does nothing if the underlying connection is closed.
virtual void send(std::unique_ptr<folly::IOBuf>) = 0;
/// Whether the duplex connection respects frame boundaries.
virtual bool isFramed() const {
return false;
}
};
} // namespace rsocket