FastLED 3.9.15
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);
29
31 StreamHandle& then(fl::function<void(const fl::json&)> cb);
32
34 StreamHandle& catch_(fl::function<void(const fl::task::Error&)> cb);
35
37 fl::task::Promise<fl::json>& promise();
38
40 bool valid() const;
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);
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);
64
67
68 // Connection Management
69
72 virtual bool connect() = 0;
73
75 virtual void disconnect() = 0;
76
79 virtual bool isConnected() const = 0;
80
81 // RequestSource Implementation (for Remote)
82
87
88 // ResponseSink Implementation (for Remote)
89
92 void writeResponse(const fl::json& response);
93
94 // Promise-based RPC API
95
98 fl::task::Promise<fl::json> rpc(const fl::string& method, const fl::json& params);
99
101 fl::task::Promise<fl::json> rpc(const fl::json& fullRequest);
102
105 StreamHandle rpcStream(const fl::string& method, const fl::json& params);
106
108 StreamHandle rpcStream(const fl::json& fullRequest);
109
110 // Update Loop
111
115 void update(u32 currentTimeMs);
116
117 // Callbacks
118
120 void setOnConnect(StateCallback callback);
121
123 void setOnDisconnect(StateCallback callback);
124
125 // Configuration
126
129 void setHeartbeatInterval(u32 intervalMs);
130
133 u32 getHeartbeatInterval() const;
134
137 void setTimeout(u32 timeoutMs);
138
141 u32 getTimeout() const;
142
143protected:
144 // Abstract methods for subclasses
145
149 virtual int sendData(fl::span<const u8> data) = 0;
150
154 virtual int recvData(fl::span<u8> buffer) = 0;
155
158 virtual u32 getCurrentTimeMs() const;
159
161 virtual void triggerReconnect();
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
204 void sendHeartbeat();
205 void checkHeartbeatTimeout(u32 currentTimeMs);
206 bool processIncomingData();
207 void handleConnectionStateChange(u32 currentTimeMs);
209 bool resolveRpc(const fl::json& msg, const fl::string& idKey);
210 bool resolveRpcStream(const fl::json& msg, const fl::string& idKey);
211 static fl::string idToString(const fl::json& id);
212};
213
214} // namespace http
215} // namespace net
216} // namespace fl
void writeResponse(const fl::json &response)
Write JSON-RPC response to stream.
bool resolveRpc(const fl::json &msg, const fl::string &idKey)
StreamHandle rpcStream(const fl::string &method, const fl::json &params)
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)
Send a JSON-RPC request, returns promise that resolves with the final response.
void setOnDisconnect(StateCallback callback)
Set callback for connection lost.
virtual void triggerReconnect()
Trigger reconnection (for subclasses to override)
fl::flat_map< fl::string, PendingCall, fl::StringFastLess > mPendingCalls
virtual int recvData(fl::span< u8 > buffer)=0
Receive raw data from connection.
void handleConnectionStateChange(u32 currentTimeMs)
void update(u32 currentTimeMs)
Update connection state (handles reconnection, heartbeat) Call this in main loop.
virtual u32 getCurrentTimeMs() const
Get current time in milliseconds.
virtual bool connect()=0
Connect to server.
fl::vector< fl::json > mIncomingQueue
void setHeartbeatInterval(u32 intervalMs)
Set heartbeat interval.
fl::function< void()> StateCallback
Connection state callback.
virtual bool isConnected() const =0
Check if connected.
void setOnConnect(StateCallback callback)
Set callback for connection established.
fl::flat_map< fl::string, PendingStream, fl::StringFastLess > mPendingStreams
void setTimeout(u32 timeoutMs)
Set connection timeout.
fl::optional< fl::json > readRequest()
Read next JSON-RPC request from stream Non-blocking, returns nullopt if no complete request available...
HttpStreamTransport(const fl::string &host, u16 port, u32 heartbeatIntervalMs=30000)
Constructor.
virtual void disconnect()=0
Disconnect from server.
static fl::string idToString(const fl::json &id)
u32 getTimeout() const
Get connection timeout.
u32 getHeartbeatInterval() const
Get heartbeat interval.
virtual int sendData(fl::span< const u8 > data)=0
Send raw data over connection.
bool resolveRpcStream(const fl::json &msg, const fl::string &idKey)
Base class for HTTP streaming transport Implements RequestSource and ResponseSink for Remote class Ma...
fl::shared_ptr< fl::function< void(const fl::json &)> > updateCallback
fl::task::Promise< fl::json > & promise()
Access the underlying promise.
StreamHandle() FL_NOEXCEPT=default
StreamHandle & onData(fl::function< void(const fl::json &)> cb)
Register callback for intermediate stream data.
StreamHandle & catch_(fl::function< void(const fl::task::Error &)> cb)
Register callback for errors.
fl::task::Promise< fl::json > mPromise
fl::shared_ptr< fl::function< void(const fl::json &)> > mUpdateCallback
StreamHandle & then(fl::function< void(const fl::json &)> cb)
Register callback for final result.
bool valid() const
Check if handle is valid.
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
Optional< T > optional
Definition optional.h:16
Base definition for an LED controller.
Definition crgb.hpp:179
Promise-based fluent API for FastLED - standalone async primitives.
#define FL_NOEXCEPT