FastLED 3.10.8
Loading...
Searching...
No Matches
server.cpp.hpp
Go to the documentation of this file.
2#include "fl/stl/json.h"
3#include "fl/stl/cstddef.h"
4#include "fl/stl/move.h"
5#include "fl/stl/optional.h"
6#include "fl/stl/vector.h"
7#include "fl/stl/noexcept.h"
8
9namespace fl {
10
12 : mRequestSource([]() { return fl::nullopt; })
13 , mResponseSink([](const fl::json&) {})
14{}
15
20
24
28
32
34#if FL_PLATFORM_HAS_LARGE_MEMORY
35 mResponseStreamSink = fl::move(sink);
36#else
37 (void)sink;
38#endif
39}
40
42 size_t processed = pull();
43 size_t sent = push();
44 return processed + sent;
45}
46
49 return 0;
50 }
51
52 size_t processed = 0;
53
54 // Pull JSON-RPC requests from source until none available
55 while (auto optRequest = mRequestSource()) {
56 fl::json request = fl::move(*optRequest);
57
58 // Process request through handler
59 fl::json response = mRequestHandler(request);
60
61 // Queue response (skip scheduled acknowledgments and async skip markers).
62 // `noEnqueue` is the new envelope marker (#3228); accept legacy `__skip`
63 // for one release of back-compat.
64 bool isScheduledAck = response.contains("scheduled") && response["scheduled"].as_bool().value_or(false);
65 bool isAsyncSkip = (response.contains("noEnqueue") && response["noEnqueue"].as_bool().value_or(false))
66 || (response.contains("__skip") && response["__skip"].as_bool().value_or(false));
67 if (!response.is_null() && !isScheduledAck && !isAsyncSkip) {
68 mOutgoingQueue.push_back(fl::move(response));
69 }
70
71 processed++;
72 }
73
74 return processed;
75}
76
78 if (!mResponseSink) {
79 return 0;
80 }
81
82 size_t sent = 0;
83
84 // Push queued responses
85 while (!mOutgoingQueue.empty()) {
87 mOutgoingQueue.erase(mOutgoingQueue.begin());
88 sent++;
89 }
90
91 return sent;
92}
93
94} // namespace fl
void setRequestSource(RequestSource source) FL_NO_EXCEPT
Set request source callback.
fl::vector< fl::json > mOutgoingQueue
Definition server.h:104
fl::function< fl::optional< fl::json >()> RequestSource
Definition server.h:31
void setRequestHandler(RequestHandler handler) FL_NO_EXCEPT
Set request handler.
size_t update() FL_NO_EXCEPT
Main update: pull + push.
void setResponseSink(ResponseSink sink) FL_NO_EXCEPT
Set response sink callback.
Server() FL_NO_EXCEPT
Default constructor.
size_t pull() FL_NO_EXCEPT
Pull requests from source, process, queue responses.
RequestHandler mRequestHandler
Definition server.h:100
RequestSource mRequestSource
Definition server.h:98
void setResponseStreamSink(ResponseStreamSink sink) FL_NO_EXCEPT
Set streaming response sink callback.
size_t push() FL_NO_EXCEPT
Push queued responses to sink.
fl::function< void(const fl::json &)> ResponseSink
Definition server.h:32
fl::function< fl::json(const fl::json &)> RequestHandler
Definition server.h:33
ResponseSink mResponseSink
Definition server.h:99
FastLED's Elegant JSON Library: fl::json
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
Definition move.h:30
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
constexpr nullopt_t nullopt
Definition optional.h:13
fl::function< void(fl::JsonStreamCallback)> ResponseStreamSink
Base definition for an LED controller.
Definition crgb.hpp:179