52 , mLastHeartbeatSent(0)
53 , mLastHeartbeatReceived(0)
54 , mHeartbeatInterval(heartbeatIntervalMs)
56 , mWasConnected(
false) {
74 return id.as_string().value();
77 return id.to_string();
82 size_t chunkSize =
mReader.nextChunkSize();
90 if (chunkSize <=
sizeof(stackBuf)) {
109 if (
json[
"method"].as_string() ==
"rpc.ping") {
141 if (msg.contains(
"error")) {
149 if (msg.contains(
"result") && msg[
"result"].contains(
"acknowledged")) {
150 if (msg[
"result"][
"acknowledged"].as_bool() ==
true) {
170 if (msg.contains(
"error")) {
178 if (msg.contains(
"result") && msg[
"result"].contains(
"acknowledged")) {
179 if (msg[
"result"][
"acknowledged"].as_bool() ==
true) {
186 if (msg.contains(
"result") && msg[
"result"].contains(
"update")) {
194 if (msg.contains(
"result") && msg[
"result"].contains(
"stop")) {
195 if (msg[
"result"][
"stop"].as_bool() ==
true) {
197 if (msg[
"result"].contains(
"value")) {
216 request.
set(
"jsonrpc",
"2.0");
217 request.
set(
"method", method);
218 request.
set(
"params", params);
219 request.
set(
"id",
id);
243 request.
set(
"jsonrpc",
"2.0");
244 request.
set(
"method", method);
245 request.
set(
"params", params);
246 request.
set(
"id",
id);
262 ps.updateCallback = updateCb;
308 if (needed <=
sizeof(stackBuf)) {
314 size_t written =
mWriter.writeChunk(
403 heartbeat.
set(
"jsonrpc",
"2.0");
404 heartbeat.
set(
"method",
"rpc.ping");
436 if (bytesRead == 0) {
const char * c_str() const FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
void set(const fl::string &key, const json &value) FL_NO_EXCEPT
bool is_null() const FL_NO_EXCEPT
bool contains(size_t idx) const FL_NO_EXCEPT
static json parse(const fl::string &txt) FL_NO_EXCEPT
static json object() FL_NO_EXCEPT
static size_t chunkOverhead(size_t dataLen) FL_NO_EXCEPT
virtual ~HttpStreamTransport() FL_NO_EXCEPT
Virtual destructor.
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 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.
u32 mLastHeartbeatReceived
fl::vector< fl::json > mIncomingQueue
fl::function< void()> StateCallback
Connection state callback.
void parseChunkedMessages() FL_NO_EXCEPT
static fl::string idToString(const fl::json &id) FL_NO_EXCEPT
StreamHandle rpcStream(const fl::string &method, const fl::json ¶ms) 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 ¶ms) 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.
bool processIncomingData() FL_NO_EXCEPT
u32 getHeartbeatInterval() const FL_NO_EXCEPT
Get heartbeat interval.
void setOnDisconnect(StateCallback callback) FL_NO_EXCEPT
Set callback for connection lost.
void sendHeartbeat() FL_NO_EXCEPT
StateCallback mOnDisconnect
void setOnConnect(StateCallback callback) FL_NO_EXCEPT
Set callback for connection established.
u32 getTimeout() const FL_NO_EXCEPT
Get connection timeout.
HttpConnection mConnection
fl::shared_ptr< fl::function< void(const fl::json &)> > updateCallback
fl::task::Promise< fl::json > promise
fl::task::Promise< fl::json > promise
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...
const T * data() const FL_NO_EXCEPT
bool complete_with_value(const T &value) FL_NO_EXCEPT
Complete the Promise with a result (used by networking library)
static Promise< T > create() FL_NO_EXCEPT
Create a pending Promise.
bool complete_with_error(const Error &error) FL_NO_EXCEPT
Complete the Promise with an error (used by networking library)
Promise class that provides fluent .then() and .catch_() semantics This is a lightweight wrapper arou...
void reserve(fl::size n) FL_NO_EXCEPT
void resize(fl::size n) FL_NO_EXCEPT
void push_back(const T &value) FL_NO_EXCEPT
FastLED's Elegant JSON Library: fl::json
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
shared_ptr< T > make_shared(Args &&... args) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr int type_rank< T >::value
int snprintf(char *buffer, fl::size size, const char *format) FL_NO_EXCEPT
fl::u32 millis() FL_NO_EXCEPT
Universal millisecond timer - returns milliseconds since system startup.
expected< T, E > result
Alias for expected (Rust-style naming)
constexpr nullopt_t nullopt
Base definition for an LED controller.