20#include <aws/event-stream/event_stream_rpc_client.h>
21#include <aws/io/host_resolver.h>
34 class ClientBootstrap;
37 namespace Eventstreamrpc
72 const struct aws_event_stream_header_value_pair &header,
89 void SetHeaderName(const Crt::
String &);
91 bool GetValueAsBoolean(
bool &);
92 bool GetValueAsByte(int8_t &);
93 bool GetValueAsShort(int16_t &);
94 bool GetValueAsInt(int32_t &);
95 bool GetValueAsLong(int64_t &);
96 bool GetValueAsTimestamp(Crt::DateTime &);
97 bool GetValueAsString(Crt::
String &) const noexcept;
99 bool GetValueAsUUID(Crt::UUID &);
101 const struct aws_event_stream_header_value_pair *GetUnderlyingHandle() const;
108 struct aws_event_stream_header_value_pair m_underlyingHandle;
152 ConnectionConfig() noexcept : m_clientBootstrap(
nullptr), m_connectRequestCallback(
nullptr) {}
159 return m_tlsConnectionOptions;
165 return [&](void) ->
const MessageAmendment & {
return m_connectAmendment; };
169 void SetPort(uint16_t port)
noexcept { m_port = port; }
172 m_socketOptions = socketOptions;
176 m_connectAmendment = connectAmendment;
180 m_tlsConnectionOptions = tlsConnectionOptions;
184 m_clientBootstrap = clientBootstrap;
188 m_connectRequestCallback = connectRequestCallback;
234 virtual void OnConnectCallback();
240 virtual void OnDisconnectCallback(
RpcError status);
248 virtual bool OnErrorCallback(
RpcError status);
253 virtual void OnPingCallback(
265 : clientContinuation(clientContinuation), allocator(allocator)
267 continuationDestroyed =
false;
286 uint32_t messageFlags) = 0;
310 std::future<RpcError> Activate(
315 uint32_t messageFlags,
317 bool IsClosed()
noexcept;
321 const Crt::Optional<Crt::
ByteBuf> &payload,
323 uint32_t messageFlags,
330 struct aws_event_stream_rpc_client_continuation_token *m_continuationToken;
331 static
void s_onContinuationMessage(
332 struct aws_event_stream_rpc_client_continuation_token *continuationToken,
333 const struct aws_event_stream_rpc_message_args *messageArgs,
334 void *userData) noexcept;
335 static
void s_onContinuationClosed(
336 struct aws_event_stream_rpc_client_continuation_token *continuationToken,
337 void *userData) noexcept;
358 virtual void SerializeToJsonObject(
Crt::JsonObject &payloadObject)
const override;
373 virtual void OnStreamClosed();
410 operator bool()
const noexcept;
414 RpcError GetRpcError()
const noexcept;
420 : m_response(std::move(response))
424 OperationResult() noexcept : m_response(
nullptr) {}
425 ~OperationResult() noexcept {};
426 Crt::ScopedResource<AbstractShapeBase> m_response;
427 Crt::ScopedResource<OperationError> m_error;
429 ResultType m_responseType;
430 OperationResult m_operationResult;
475 virtual Crt::
String GetRequestModelName() const noexcept = 0;
476 virtual Crt::Optional<Crt::
String> GetStreamingResponseModelName() const noexcept = 0;
477 virtual Crt::
String GetOperationName() const noexcept = 0;
479 const Crt::
String &errorModelName,
481 Crt::
Allocator *allocator) const noexcept
483 return m_serviceModel.AllocateOperationErrorFromPayload(errorModelName, stringView, allocator);
511 virtual Crt::
String GetModelName() const noexcept = 0;
517 const Crt::
String &modelName,
518 const Crt::Optional<Crt::
ByteBuf> &payload,
519 uint32_t messageFlags);
523 void OnContinuationMessage(
525 const Crt::Optional<Crt::
ByteBuf> &payload,
527 uint32_t messageFlags) override;
535 void OnContinuationClosed() override;
548 uint32_t m_messageCount;
553 std::mutex m_continuationMutex;
554 bool m_resultReceived;
555 std::promise<TaggedResult> m_initialResponsePromise;
556 std::atomic_int m_expectedCloses;
557 std::atomic_bool m_streamClosedCalled;
558 std::condition_variable m_closeReady;
574 Crt::Io::ClientBootstrap &clientBootstrap) noexcept;
578 const Crt::Optional<Crt::
ByteBuf> &payload,
583 const Crt::Optional<Crt::
ByteBuf> &payload,
588 void Close() noexcept;
590 bool IsOpen() const noexcept
592 if (this->m_underlyingConnection ==
nullptr)
598 return aws_event_stream_rpc_client_connection_is_open(this->m_underlyingConnection);
605 operator bool() const noexcept {
return IsOpen(); }
614 WAITING_FOR_CONNECT_ACK,
618 std::mutex m_continuationVectorMutex;
621 std::recursive_mutex m_stateMutex;
623 struct aws_event_stream_rpc_client_connection *m_underlyingConnection;
624 ClientState m_clientState;
627 std::promise<void> m_connectionSetupPromise;
628 bool m_connectionWillSetup;
629 std::promise<RpcError> m_connectAckedPromise;
630 std::promise<RpcError> m_closedPromise;
631 bool m_onConnectCalled;
636 std::future<RpcError> SendProtocolMessage(
640 uint32_t messageFlags,
643 static void s_onConnectionShutdown(
644 struct aws_event_stream_rpc_client_connection *connection,
646 void *userData)
noexcept;
647 static void s_onConnectionSetup(
648 struct aws_event_stream_rpc_client_connection *connection,
650 void *userData)
noexcept;
651 static void s_onProtocolMessage(
652 struct aws_event_stream_rpc_client_connection *connection,
653 const struct aws_event_stream_rpc_message_args *messageArgs,
654 void *userData)
noexcept;
656 static void s_protocolMessageCallback(
int errorCode,
void *userData)
noexcept;
657 static std::future<RpcError> s_sendProtocolMessage(
662 uint32_t messageFlags,
665 static std::future<RpcError> s_sendPing(
671 static std::future<RpcError> s_sendPingResponse(
OPERATION_RESPONSE
Definition: EventStreamClient.h:391
OPERATION_ERROR
Definition: EventStreamClient.h:392
Definition: DateTime.h:53
Definition: Bootstrap.h:35
Definition: SocketOptions.h:48
Definition: TlsOptions.h:274
Definition: JsonObject.h:21
Definition: Optional.h:17
Definition: StringView.h:32
Definition: EventStreamClient.h:341
virtual void SerializeToJsonObject(Crt::JsonObject &payloadObject) const =0
virtual Crt::String GetModelName() const noexcept=0
Definition: EventStreamClient.h:562
ClientConnection & operator=(const ClientConnection &) noexcept=delete
ClientConnection(const ClientConnection &) noexcept=delete
Definition: EventStreamClient.h:277
virtual void OnContinuationMessage(const Crt::List< EventStreamHeader > &headers, const Crt::Optional< Crt::ByteBuf > &payload, MessageType messageType, uint32_t messageFlags)=0
virtual void OnContinuationClosed()=0
Definition: EventStreamClient.h:303
Definition: EventStreamClient.h:491
std::future< RpcError > Close(OnMessageFlushCallback onMessageFlushCallback=nullptr) noexcept
Definition: EventStreamClient.cpp:1532
ClientOperation(const ClientOperation &clientOperation) noexcept=delete
Definition: EventStreamClient.h:150
Crt::Optional< uint16_t > m_port
Definition: EventStreamClient.h:193
void SetTlsConnectionOptions(Crt::Io::TlsConnectionOptions tlsConnectionOptions) noexcept
Definition: EventStreamClient.h:178
void SetConnectAmendment(const MessageAmendment &connectAmendment) noexcept
Definition: EventStreamClient.h:174
void SetSocketOptions(const Crt::Io::SocketOptions &socketOptions) noexcept
Definition: EventStreamClient.h:170
Crt::Optional< Crt::String > GetHostName() const noexcept
Definition: EventStreamClient.h:153
Crt::Io::ClientBootstrap * GetClientBootstrap() const noexcept
Definition: EventStreamClient.h:161
Crt::Optional< Crt::Io::TlsConnectionOptions > m_tlsConnectionOptions
Definition: EventStreamClient.h:195
void SetConnectRequestCallback(OnMessageFlushCallback connectRequestCallback) noexcept
Definition: EventStreamClient.h:186
Crt::Optional< Crt::Io::TlsConnectionOptions > GetTlsConnectionOptions() const noexcept
Definition: EventStreamClient.h:157
void SetPort(uint16_t port) noexcept
Definition: EventStreamClient.h:169
ConnectionConfig() noexcept
Definition: EventStreamClient.h:152
OnMessageFlushCallback GetConnectRequestCallback() const noexcept
Definition: EventStreamClient.h:162
Crt::Io::ClientBootstrap * m_clientBootstrap
Definition: EventStreamClient.h:196
Crt::Optional< MessageAmendment > GetConnectAmendment() const noexcept
Definition: EventStreamClient.h:156
MessageAmendment m_connectAmendment
Definition: EventStreamClient.h:197
void SetHostName(Crt::String hostName) noexcept
Definition: EventStreamClient.h:168
Crt::Optional< Crt::String > m_hostName
Definition: EventStreamClient.h:192
OnMessageFlushCallback m_connectRequestCallback
Definition: EventStreamClient.h:198
void SetClientBootstrap(Crt::Io::ClientBootstrap *clientBootstrap) noexcept
Definition: EventStreamClient.h:182
Crt::Optional< uint16_t > GetPort() const noexcept
Definition: EventStreamClient.h:154
ConnectMessageAmender GetConnectMessageAmender() const noexcept
Definition: EventStreamClient.h:163
Crt::Optional< Crt::Io::SocketOptions > GetSocketOptions() const noexcept
Definition: EventStreamClient.h:155
Crt::Optional< Crt::Io::SocketOptions > m_socketOptions
Definition: EventStreamClient.h:194
Definition: EventStreamClient.h:227
Definition: EventStreamClient.h:260
ClientContinuation * clientContinuation
Definition: EventStreamClient.h:272
ContinuationCallbackData(ClientContinuation *clientContinuation, Crt::Allocator *allocator=Crt::g_allocator) noexcept
Definition: EventStreamClient.h:262
bool continuationDestroyed
Definition: EventStreamClient.h:270
std::mutex callbackMutex
Definition: EventStreamClient.h:271
Crt::Allocator * allocator
Definition: EventStreamClient.h:273
ContinuationCallbackData(const ContinuationCallbackData &lhs) noexcept=delete
Definition: EventStreamClient.h:117
Definition: EventStreamClient.h:354
virtual Crt::Optional< Crt::String > GetMessage() noexcept=0
Definition: EventStreamClient.h:465
virtual Crt::ScopedResource< AbstractShapeBase > AllocateStreamingResponseFromPayload(Crt::StringView stringView, Crt::Allocator *allocator) const noexcept=0
virtual Crt::ScopedResource< AbstractShapeBase > AllocateInitialResponseFromPayload(Crt::StringView stringView, Crt::Allocator *allocator) const noexcept=0
virtual Crt::String GetInitialResponseModelName() const noexcept=0
Definition: EventStreamClient.h:444
virtual ExpectedResponseFactory GetStreamingResponseFromModelName(const Crt::String &modelName) const noexcept=0
virtual ErrorResponseFactory GetOperationErrorFromModelName(const Crt::String &modelName) const noexcept=0
virtual ExpectedResponseFactory GetInitialResponseFromModelName(const Crt::String &modelName) const noexcept=0
Definition: EventStreamClient.h:456
virtual Crt::ScopedResource< OperationError > AllocateOperationErrorFromPayload(const Crt::String &errorModelName, Crt::StringView stringView, Crt::Allocator *allocator) const noexcept=0
Definition: EventStreamClient.h:368
Definition: EventStreamClient.h:397
ResultType GetResultType() const noexcept
Definition: EventStreamClient.h:415
#define AWS_EVENTSTREAMRPC_API
Definition: Exports.h:19
aws_allocator Allocator
Definition: StlAllocator.h:17
std::list< T, StlAllocator< T > > List
Definition: Types.h:56
AWS_CRT_CPP_API Allocator * g_allocator
Definition: Api.cpp:21
std::basic_string< char, std::char_traits< char >, StlAllocator< char > > String
Definition: Types.h:47
string_view StringView
Definition: StringView.h:845
aws_byte_buf ByteBuf
Definition: Types.h:32
std::unique_ptr< T, std::function< void(T *)> > ScopedResource
Definition: Types.h:165
std::vector< T, StlAllocator< T > > Vector
Definition: Types.h:55
aws_event_stream_rpc_message_type MessageType
Definition: EventStreamClient.h:46
std::function< ErrorResponseFactory(const Crt::String &modelName)> ErrorResponseRetriever
Definition: EventStreamClient.h:441
std::function< void(int errorCode)> OnMessageFlushCallback
Definition: EventStreamClient.h:52
aws_event_stream_header_value_type HeaderValueType
Definition: EventStreamClient.h:45
std::function< Crt::ScopedResource< AbstractShapeBase >(const Crt::StringView &payload, Crt::Allocator *allocator)> ExpectedResponseFactory
Definition: EventStreamClient.h:435
EventStreamRpcStatusCode
Definition: EventStreamClient.h:202
@ EVENT_STREAM_RPC_CONNECTION_SETUP_FAILED
Definition: EventStreamClient.h:207
@ EVENT_STREAM_RPC_UNMAPPED_DATA
Definition: EventStreamClient.h:213
@ EVENT_STREAM_RPC_CONNECTION_ALREADY_ESTABLISHED
Definition: EventStreamClient.h:209
@ EVENT_STREAM_RPC_UNINITIALIZED
Definition: EventStreamClient.h:205
@ EVENT_STREAM_RPC_NULL_PARAMETER
Definition: EventStreamClient.h:204
@ EVENT_STREAM_RPC_CRT_ERROR
Definition: EventStreamClient.h:215
@ EVENT_STREAM_RPC_SUCCESS
Definition: EventStreamClient.h:203
@ EVENT_STREAM_RPC_CONNECTION_ACCESS_DENIED
Definition: EventStreamClient.h:208
@ EVENT_STREAM_RPC_CONTINUATION_CLOSED
Definition: EventStreamClient.h:211
@ EVENT_STREAM_RPC_CONNECTION_CLOSED
Definition: EventStreamClient.h:210
@ EVENT_STREAM_RPC_UNSUPPORTED_CONTENT_TYPE
Definition: EventStreamClient.h:214
@ EVENT_STREAM_RPC_UNKNOWN_PROTOCOL_MESSAGE
Definition: EventStreamClient.h:212
@ EVENT_STREAM_RPC_ALLOCATION_ERROR
Definition: EventStreamClient.h:206
std::function< ExpectedResponseFactory(const Crt::String &modelName)> StreamingResponseRetriever
Definition: EventStreamClient.h:440
std::function< const MessageAmendment &(void)> ConnectMessageAmender
Definition: EventStreamClient.h:59
std::function< ExpectedResponseFactory(const Crt::String &modelName)> LoneResponseRetriever
Definition: EventStreamClient.h:439
std::function< Crt::ScopedResource< OperationError >(const Crt::StringView &payload, Crt::Allocator *allocator)> ErrorResponseFactory
Definition: EventStreamClient.h:437
const char *const name
Definition: cJSON.h:282
Definition: StringView.h:851
Definition: EventStreamClient.h:219
int crtError
Definition: EventStreamClient.h:221
EventStreamRpcStatusCode baseStatus
Definition: EventStreamClient.h:220
Definition: cJSON.cpp:105