FastLED 3.9.15
Loading...
Searching...
No Matches
fetch.h
Go to the documentation of this file.
1#pragma once
2
53
54#include "fl/namespace.h"
55#include "fl/promise.h"
56#include "fl/string.h"
57#include "fl/vector.h"
58#include "fl/map.h"
59#include "fl/hash_map.h"
60#include "fl/optional.h"
61#include "fl/function.h"
62#include "fl/ptr.h"
63#include "fl/async.h"
64#include "fl/mutex.h"
65#include "fl/warn.h"
66#include "fl/json.h" // Add JSON support for response.json() method
67
68namespace fl {
69
70// Forward declarations
71class fetch_options;
72class FetchManager;
73
74#ifdef __EMSCRIPTEN__
75// Forward declarations for WASM-specific types (defined in platforms/wasm/js_fetch.h)
76class WasmFetchRequest;
77class WasmFetch;
78using FetchResponseCallback = fl::function<void(const response&)>;
79extern WasmFetch wasm_fetch;
80#endif
81
83class response {
84public:
85 response() : mStatusCode(200), mStatusText("OK") {}
86 response(int status_code) : mStatusCode(status_code), mStatusText(get_default_status_text(status_code)) {}
87 response(int status_code, const fl::string& status_text)
88 : mStatusCode(status_code), mStatusText(status_text) {}
89
91 int status() const { return mStatusCode; }
92
94 const fl::string& status_text() const { return mStatusText; }
95
97 bool ok() const { return mStatusCode >= 200 && mStatusCode < 300; }
98
100 const fl::string& text() const { return mBody; }
101
104 auto it = mHeaders.find(name);
105 if (it != mHeaders.end()) {
106 return fl::make_optional(it->second);
107 }
108 return fl::nullopt;
109 }
110
113 return get_header("content-type");
114 }
115
117 const fl::string& get_body_text() const { return mBody; }
118
123 fl::Json json() const;
124
127 bool is_json() const {
128 auto content_type = get_content_type();
129 if (content_type.has_value()) {
130 fl::string ct = *content_type;
131 // Check for various JSON content types (case-insensitive)
132 return ct.find("json") != fl::string::npos;
133 }
134 return false;
135 }
136
138 void set_status(int status_code) { mStatusCode = status_code; }
140 void set_text(const fl::string& body) { mBody = body; } // Backward compatibility
141 void set_body(const fl::string& body) { mBody = body; }
142 void set_header(const fl::string& name, const fl::string& value) {
143 mHeaders[name] = value;
144 }
145
146private:
151
152 // JSON parsing cache
153 mutable fl::optional<fl::Json> mCachedJson; // Lazy-loaded JSON cache
154 mutable bool mJsonParsed = false; // Track parsing attempts
155
159 if (parsed.is_null() && (!mBody.empty())) {
160 // If parsing failed but we have content, return null JSON
161 // This allows safe chaining: resp.json()["key"] | default
162 return fl::Json(nullptr);
163 }
164 return parsed;
165 }
166
168 switch (status) {
169 case 200: return "OK";
170 case 400: return "Bad Request";
171 case 401: return "Unauthorized";
172 case 403: return "Forbidden";
173 case 404: return "Not Found";
174 case 500: return "Internal Server Error";
175 case 501: return "Not Implemented";
176 case 502: return "Bad Gateway";
177 case 503: return "Service Unavailable";
178 default: return "Unknown";
179 }
180 }
181};
182
183
184
186using FetchCallback = fl::function<void(const response&)>;
187
193 int timeout_ms = 10000; // 10 second default
194
195 RequestOptions() = default;
196 RequestOptions(const fl::string& method_name) : method(method_name) {}
197};
198
201public:
202 explicit fetch_options(const fl::string& url) : mUrl(url) {}
205
207 fetch_options& method(const fl::string& http_method) {
208 mOptions.method = http_method;
209 return *this;
210 }
211
213 fetch_options& header(const fl::string& name, const fl::string& value) {
214 mOptions.headers[name] = value;
215 return *this;
216 }
217
220 mOptions.body = data;
221 return *this;
222 }
223
225 fetch_options& json(const fl::string& json_data) {
226 mOptions.body = json_data;
227 mOptions.headers["Content-Type"] = "application/json";
228 return *this;
229 }
230
232 fetch_options& timeout(int timeout_ms) {
233 mOptions.timeout_ms = timeout_ms;
234 return *this;
235 }
236
238 const fl::string& url() const { return mUrl; }
239
241 const RequestOptions& options() const { return mOptions; }
242
243private:
246
247 friend class FetchManager;
248};
249
251
254public:
255 static FetchManager& instance();
256
258
259 // async_runner interface
260 void update() override;
261 bool has_active_tasks() const override;
262 size_t active_task_count() const override;
263
264 // Legacy API
265 fl::size active_requests() const;
267
268private:
271};
272
273// ========== Simple Callback API (Backward Compatible) ==========
274
281void fetch(const fl::string& url, const FetchCallback& callback);
282
286inline void fetch(const char* url, const FetchCallback& callback) {
287 fetch(fl::string(url), callback);
288}
289
290// ========== Promise-Based API (JavaScript-like) ==========
291
293fl::promise<response> fetch_get(const fl::string& url, const fetch_options& request = fetch_options(""));
294
296fl::promise<response> fetch_post(const fl::string& url, const fetch_options& request = fetch_options(""));
297
299fl::promise<response> fetch_put(const fl::string& url, const fetch_options& request = fetch_options(""));
300
302fl::promise<response> fetch_delete(const fl::string& url, const fetch_options& request = fetch_options(""));
303
305fl::promise<response> fetch_head(const fl::string& url, const fetch_options& request = fetch_options(""));
306
308fl::promise<response> fetch_http_options(const fl::string& url, const fetch_options& request = fetch_options(""));
309
311fl::promise<response> fetch_patch(const fl::string& url, const fetch_options& request = fetch_options(""));
312
314fl::promise<response> fetch_request(const fl::string& url, const RequestOptions& options = RequestOptions());
315
318void fetch_update();
319
321fl::size fetch_active_requests();
322
324fl::promise<response> execute_fetch_request(const fl::string& url, const fetch_options& request);
325
326} // namespace fl
fl::size active_requests() const
Definition fetch.cpp:160
fl::unique_ptr< FetchEngineListener > mEngineListener
Definition fetch.h:270
static FetchManager & instance()
Definition fetch.cpp:112
void update() override
Update this async runner (called during async pumping)
Definition fetch.cpp:130
void cleanup_completed_promises()
Definition fetch.cpp:164
fl::vector< fl::promise< response > > mActivePromises
Definition fetch.h:269
void register_promise(const fl::promise< response > &promise)
Definition fetch.cpp:116
bool has_active_tasks() const override
Check if this runner has active tasks.
Definition fetch.cpp:152
size_t active_task_count() const override
Get number of active tasks (for debugging/monitoring)
Definition fetch.cpp:156
Internal fetch manager for promise tracking.
Definition fetch.h:253
bool is_null() const
Definition json.h:1730
static Json parse(const fl::string &txt)
Definition json.h:2126
fl::size find(const char &value) const
Definition str.h:408
Generic asynchronous task runner interface.
Definition async.h:64
fetch_options & json(const fl::string &json_data)
Set JSON body with proper content type.
Definition fetch.h:225
const fl::string & url() const
Get the URL for this request.
Definition fetch.h:238
fetch_options & timeout(int timeout_ms)
Set timeout in milliseconds.
Definition fetch.h:232
fetch_options & body(const fl::string &data)
Set request body.
Definition fetch.h:219
RequestOptions mOptions
Definition fetch.h:245
fetch_options & header(const fl::string &name, const fl::string &value)
Add header.
Definition fetch.h:213
fetch_options(const fl::string &url)
Definition fetch.h:202
const RequestOptions & options() const
Get the options for this request.
Definition fetch.h:241
friend class FetchManager
Definition fetch.h:247
fl::string mUrl
Definition fetch.h:244
fetch_options & method(const fl::string &http_method)
Set HTTP method.
Definition fetch.h:207
fetch_options(const fl::string &url, const RequestOptions &options)
Definition fetch.h:203
Fetch options builder (fluent interface)
Definition fetch.h:200
Promise class that provides fluent .then() and .catch_() semantics This is a lightweight wrapper arou...
Definition promise.h:72
fl::string mBody
Definition fetch.h:149
fl::Json json() const
Response body parsed as JSON (JavaScript-like API)
Definition fetch.cpp:319
void set_body(const fl::string &body)
Definition fetch.h:141
fl::optional< fl::string > get_content_type() const
Get content type convenience method.
Definition fetch.h:112
static fl::string get_default_status_text(int status)
Definition fetch.h:167
void set_text(const fl::string &body)
Definition fetch.h:140
const fl::string & get_body_text() const
Response body as text (alternative to text())
Definition fetch.h:117
fl::optional< fl::string > get_header(const fl::string &name) const
Get header value (like JavaScript response.headers.get())
Definition fetch.h:103
void set_status_text(const fl::string &status_text)
Definition fetch.h:139
void set_status(int status_code)
Set methods (internal use)
Definition fetch.h:138
const fl::string & status_text() const
HTTP status text (like JavaScript response.statusText)
Definition fetch.h:94
response(int status_code, const fl::string &status_text)
Definition fetch.h:87
int mStatusCode
Definition fetch.h:147
fl::Json parse_json_body() const
Parse JSON from response body with error handling.
Definition fetch.h:157
void set_header(const fl::string &name, const fl::string &value)
Definition fetch.h:142
fl_map< fl::string, fl::string > mHeaders
Definition fetch.h:150
bool mJsonParsed
Definition fetch.h:154
int status() const
HTTP status code (like JavaScript response.status)
Definition fetch.h:91
bool ok() const
Check if response is successful (like JavaScript response.ok)
Definition fetch.h:97
const fl::string & text() const
Response body as text (like JavaScript response.text())
Definition fetch.h:100
fl::optional< fl::Json > mCachedJson
Definition fetch.h:153
response(int status_code)
Definition fetch.h:86
fl::string mStatusText
Definition fetch.h:148
bool is_json() const
Check if response appears to contain JSON content.
Definition fetch.h:127
HTTP response class (unified interface)
Definition fetch.h:83
static const fl::size npos
Definition str.h:597
FastLED's Elegant JSON Library: fl::Json
Implements the FastLED namespace macros.
fl::promise< response > fetch_head(const fl::string &url, const fetch_options &request)
HTTP HEAD request.
Definition fetch.cpp:248
fl::promise< response > fetch_delete(const fl::string &url, const fetch_options &request)
HTTP DELETE request.
Definition fetch.cpp:231
fl::promise< response > fetch_http_options(const fl::string &url, const fetch_options &request)
HTTP OPTIONS request.
Definition fetch.cpp:265
void fetch_update()
Legacy manual update for fetch promises (use fl::async_run() for new code)
Definition fetch.cpp:307
fl::promise< response > fetch_request(const fl::string &url, const RequestOptions &options)
Generic request with options (like fetch(url, options))
Definition fetch.cpp:299
optional< T > make_optional(const T &value)
Definition optional.h:120
Optional< T > optional
Definition optional.h:14
fl::promise< response > fetch_put(const fl::string &url, const fetch_options &request)
HTTP PUT request.
Definition fetch.cpp:214
fl::size fetch_active_requests()
Get number of active requests.
Definition fetch.cpp:313
fl::promise< response > execute_fetch_request(const fl::string &url, const fetch_options &request)
Internal helper to execute a fetch request and return a promise.
Definition fetch.cpp:72
fl::promise< response > fetch_patch(const fl::string &url, const fetch_options &request)
HTTP PATCH request.
Definition fetch.cpp:282
constexpr nullopt_t nullopt
Definition optional.h:11
fl::function< void(const response &)> FetchCallback
Callback type for simple fetch responses (backward compatible)
Definition fetch.h:186
fl::promise< response > fetch_post(const fl::string &url, const fetch_options &request)
HTTP POST request.
Definition fetch.cpp:197
MapRedBlackTree< Key, T, Compare, fl::allocator_slab< char > > fl_map
Definition map.h:540
HeapVector< T, Allocator > vector
Definition vector.h:1214
void fetch(const fl::string &url, const FetchCallback &callback)
Make an HTTP GET request (cross-platform, backward compatible)
Definition fetch.cpp:63
fl::promise< response > fetch_get(const fl::string &url, const fetch_options &request)
HTTP GET request.
Definition fetch.cpp:180
IMPORTANT!
Definition crgb.h:20
Promise-based fluent API for FastLED - standalone async primitives.
Generic asynchronous task management for FastLED.
fl_map< fl::string, fl::string > headers
Definition fetch.h:191
fl::string method
Definition fetch.h:190
RequestOptions()=default
fl::string body
Definition fetch.h:192
RequestOptions(const fl::string &method_name)
Definition fetch.h:196
Request options (matches JavaScript fetch RequestInit)
Definition fetch.h:189