DDNet documentation
Loading...
Searching...
No Matches
http_emscripten.h
Go to the documentation of this file.
1#ifndef ENGINE_SHARED_HTTP_EMSCRIPTEN_H
2#define ENGINE_SHARED_HTTP_EMSCRIPTEN_H
3
4#include <base/detect.h>
5#if defined(CONF_PLATFORM_EMSCRIPTEN)
6
7#include <engine/http.h>
8
9#include <atomic>
10#include <chrono>
11#include <condition_variable>
12#include <cstdint>
13#include <deque>
14#include <mutex>
15#include <optional>
16#include <string>
17#include <unordered_map>
18#include <utility>
19#include <vector>
20
21typedef struct emscripten_fetch_t emscripten_fetch_t;
22
23class CHttpEmscripten;
24
25class CHttpRequestEmscripten : public IHttpRequest
26{
27 friend CHttpEmscripten;
28
29public:
30 CHttpRequestEmscripten(const char *pUrl);
31 ~CHttpRequestEmscripten() override;
32
33 void Header(const char *pNameColonValue) override;
34
35 void Abort() override;
36
37private:
38 CHttpEmscripten *m_pHttp;
39
40 std::vector<std::pair<std::string, std::string>> m_vRequestHeaders;
41
42 uint64_t m_RequestId;
43 emscripten_fetch_t *m_pFetch = nullptr;
44 bool m_CallbackFinished = false;
45
46 bool ConfigureAndRun();
47 void OnSuccess();
48 void OnFailure();
49 void OnProgress();
50 void OnHeader(const char *pName, const char *pValue);
51 void OnCompletionInternal(EHttpState State, const char *pErrorDetail);
52
53 static void FetchCallbackSuccess(emscripten_fetch_t *pFetch);
54 static void FetchCallbackFailure(emscripten_fetch_t *pFetch);
55 static void FetchCallbackProgress(emscripten_fetch_t *pFetch);
56};
57
58class CHttpEmscripten : public IEngineHttp
59{
60 friend CHttpRequestEmscripten;
61
62public:
63 // Lifecycle
64 bool Init(std::chrono::milliseconds ShutdownDelay) override;
65 void Shutdown() override;
66 ~CHttpEmscripten();
67
68 // User
69 void Run(std::shared_ptr<IHttpRequest> pRequest) override;
70 bool HasIpresolveBug() const override;
71
72private:
73 void *m_pThread = nullptr;
74
75 std::mutex m_Lock;
76 std::condition_variable m_ConditionVariableInit;
77 std::condition_variable m_ConditionVariableLoop;
78 std::atomic<bool> m_Initialized = false;
79 uint64_t m_NextRequestId = 0;
80 std::deque<std::shared_ptr<CHttpRequestEmscripten>> m_PendingRequests;
81 std::unordered_map<uint64_t, EHttpState> m_PendingFetchChanges;
82 std::unordered_map<uint64_t, std::shared_ptr<CHttpRequestEmscripten>> m_RunningRequests;
83 std::chrono::milliseconds m_ShutdownDelay{};
84 std::optional<std::chrono::time_point<std::chrono::steady_clock>> m_ShutdownTime;
85 std::atomic<bool> m_Shutdown = false;
86 std::atomic<bool> m_StartedShutdown = false;
87
88 static void ThreadMain(void *pUser);
89 void RunLoop();
90 void AddPendingStateChange(uint64_t RequestId, EHttpState State);
91};
92
93#endif // CONF_PLATFORM_EMSCRIPTEN
94#endif // ENGINE_SHARED_HTTP_EMSCRIPTEN_H
Definition http.h:266
Definition http.h:53
EHttpState
Definition http.h:21