FastLED 3.10.8
Loading...
Searching...
No Matches
stream_transport.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/task/promise.h"
4#include "fl/stl/function.h"
5#include "fl/stl/optional.h"
6#include "fl/stl/shared_ptr.h"
7#include "fl/stl/span.h"
8#include "fl/stl/string.h"
9#include "fl/stl/flat_map.h"
10#include "fl/stl/vector.h"
13#include "fl/stl/noexcept.h"
14
15namespace fl {
16namespace net {
17namespace http {
18
19class HttpStreamTransport; // IWYU pragma: keep
20
24public:
26
28 StreamHandle& onData(fl::function<void(const fl::json&)> cb) FL_NO_EXCEPT;
29
31 StreamHandle& then(fl::function<void(const fl::json&)> cb) FL_NO_EXCEPT;
32
34 StreamHandle& catch_(fl::function<void(const fl::task::Error&)> cb) FL_NO_EXCEPT;
35
37 fl::task::Promise<fl::json>& promise() FL_NO_EXCEPT;
38
40 bool valid() const FL_NO_EXCEPT;
41
42private:
43 friend class HttpStreamTransport;
44 StreamHandle(fl::task::Promise<fl::json> p,
45 fl::shared_ptr<fl::function<void(const fl::json&)>> updateCb) FL_NO_EXCEPT;
46
47 fl::task::Promise<fl::json> mPromise;
49};
50
55public:
57 using StateCallback = fl::function<void()>;
58
63 HttpStreamTransport(const fl::string& host, u16 port, u32 heartbeatIntervalMs = 30000) FL_NO_EXCEPT;
64
67
68 // Connection Management
69
72 virtual bool connect() FL_NO_EXCEPT = 0;
73
75 virtual void disconnect() FL_NO_EXCEPT = 0;
76
79 virtual bool isConnected() const FL_NO_EXCEPT = 0;
80
81 // RequestSource Implementation (for Remote)
82
87
88 // ResponseSink Implementation (for Remote)
89
92 void writeResponse(const fl::json& response) FL_NO_EXCEPT;
93
94 // Promise-based RPC API
95
98 fl::task::Promise<fl::json> rpc(const fl::string& method, const fl::json& params) FL_NO_EXCEPT;
99
101 fl::task::Promise<fl::json> rpc(const fl::json& fullRequest) FL_NO_EXCEPT;
102
105 StreamHandle rpcStream(const fl::string& method, const fl::json& params) FL_NO_EXCEPT;
106
108 StreamHandle rpcStream(const fl::json& fullRequest) FL_NO_EXCEPT;
109
110 // Update Loop
111
115 void update(u32 currentTimeMs) FL_NO_EXCEPT;
116
117 // Callbacks
118
121
124
125 // Configuration
126
129 void setHeartbeatInterval(u32 intervalMs) FL_NO_EXCEPT;
130
134
137 void setTimeout(u32 timeoutMs) FL_NO_EXCEPT;
138
141 u32 getTimeout() const FL_NO_EXCEPT;
142
143protected:
144 // Abstract methods for subclasses
145
149 virtual int sendData(fl::span<const u8> data) FL_NO_EXCEPT = 0;
150
154 virtual int recvData(fl::span<u8> buffer) FL_NO_EXCEPT = 0;
155
158 virtual u32 getCurrentTimeMs() const FL_NO_EXCEPT;
159
161 virtual void triggerReconnect() FL_NO_EXCEPT;
162
163 // Connection management
165
166private:
167 // Pending call state (for rpc())
172
173 // Pending stream state (for rpcStream())
179
180 // Chunked encoding
183
184 // Heartbeat tracking
189
190 // Connection state
192
193 // Callbacks
196
197 // Promise-based call tracking
201 int mNextCallId = 1;
202
203 // Internal methods
205 void checkHeartbeatTimeout(u32 currentTimeMs) FL_NO_EXCEPT;
207 void handleConnectionStateChange(u32 currentTimeMs) FL_NO_EXCEPT;
209 bool resolveRpc(const fl::json& msg, const fl::string& idKey) FL_NO_EXCEPT;
210 bool resolveRpcStream(const fl::json& msg, const fl::string& idKey) FL_NO_EXCEPT;
211 static fl::string idToString(const fl::json& id) FL_NO_EXCEPT;
212};
213
214} // namespace http
215} // namespace net
216} // namespace fl
void update(u32 currentTimeMs) FL_NO_EXCEPT
Update connection state (handles reconnection, heartbeat) Call this in main loop.
void handleConnectionStateChange(u32 currentTimeMs) FL_NO_EXCEPT
bool resolveRpc(const fl::json &msg, const fl::string &idKey) FL_NO_EXCEPT
void checkHeartbeatTimeout(u32 currentTimeMs) FL_NO_EXCEPT
fl::optional< fl::json > readRequest() FL_NO_EXCEPT
Read next JSON-RPC request from stream Non-blocking, returns nullopt if no complete request available...
void writeResponse(const fl::json &response) FL_NO_EXCEPT
Write JSON-RPC response to stream.
virtual u32 getCurrentTimeMs() const FL_NO_EXCEPT
Get current time in milliseconds.
virtual bool connect() FL_NO_EXCEPT=0
Connect to server.
virtual void triggerReconnect() FL_NO_EXCEPT
Trigger reconnection (for subclasses to override)
virtual int recvData(fl::span< u8 > buffer) FL_NO_EXCEPT=0
Receive raw data from connection.
virtual int sendData(fl::span< const u8 > data) FL_NO_EXCEPT=0
Send raw data over connection.
HttpStreamTransport(const fl::string &host, u16 port, u32 heartbeatIntervalMs=30000) FL_NO_EXCEPT
Constructor.
fl::flat_map< fl::string, PendingCall, fl::StringFastLess > mPendingCalls
bool resolveRpcStream(const fl::json &msg, const fl::string &idKey) FL_NO_EXCEPT
void setTimeout(u32 timeoutMs) FL_NO_EXCEPT
Set connection timeout.
void setHeartbeatInterval(u32 intervalMs) FL_NO_EXCEPT
Set heartbeat interval.
fl::vector< fl::json > mIncomingQueue
fl::function< void()> StateCallback
Connection state callback.
static fl::string idToString(const fl::json &id) FL_NO_EXCEPT
StreamHandle rpcStream(const fl::string &method, const fl::json &params) FL_NO_EXCEPT
Send a streaming JSON-RPC request, returns StreamHandle for intermediate data.
fl::task::Promise< fl::json > rpc(const fl::string &method, const fl::json &params) FL_NO_EXCEPT
Send a JSON-RPC request, returns promise that resolves with the final response.
fl::flat_map< fl::string, PendingStream, fl::StringFastLess > mPendingStreams
virtual void disconnect() FL_NO_EXCEPT=0
Disconnect from server.
virtual bool isConnected() const FL_NO_EXCEPT=0
Check if connected.
u32 getHeartbeatInterval() const FL_NO_EXCEPT
Get heartbeat interval.
void setOnDisconnect(StateCallback callback) FL_NO_EXCEPT
Set callback for connection lost.
void setOnConnect(StateCallback callback) FL_NO_EXCEPT
Set callback for connection established.
u32 getTimeout() const FL_NO_EXCEPT
Get connection timeout.
Base class for HTTP streaming transport Implements RequestSource and ResponseSink for Remote class Ma...
fl::shared_ptr< fl::function< void(const fl::json &)> > updateCallback
StreamHandle & then(fl::function< void(const fl::json &)> cb) FL_NO_EXCEPT
Register callback for final result.
StreamHandle & catch_(fl::function< void(const fl::task::Error &)> cb) FL_NO_EXCEPT
Register callback for errors.
fl::task::Promise< fl::json > mPromise
fl::shared_ptr< fl::function< void(const fl::json &)> > mUpdateCallback
StreamHandle() FL_NO_EXCEPT=default
bool valid() const FL_NO_EXCEPT
Check if handle is valid.
StreamHandle & onData(fl::function< void(const fl::json &)> cb) FL_NO_EXCEPT
Register callback for intermediate stream data.
fl::task::Promise< fl::json > & promise() FL_NO_EXCEPT
Access the underlying promise.
Handle for ASYNC_STREAM calls Provides onData() for intermediate updates, plus then()/catch_() for fi...
Promise class that provides fluent .then() and .catch_() semantics This is a lightweight wrapper arou...
Definition promise.h:58
unsigned char u8
Definition stdint.h:131
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
Optional< T > optional
Definition optional.h:16
Base definition for an LED controller.
Promise-based fluent API for FastLED - standalone async primitives.