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 std::atomic<bool> m_Initialized = false;
40
41 std::vector<std::pair<std::string, std::string>> m_vRequestHeaders;
42
43 uint64_t m_RequestId;
44 emscripten_fetch_t *m_pFetch = nullptr;
45 uint64_t m_LowSpeedOffset;
46 std::chrono::nanoseconds m_LowSpeedCheckTime;
47 bool m_CallbackFinished = false;
48
49 bool ConfigureAndRun();
50 void OnSuccess();
51 void OnFailure();
52 void OnProgress();
53 void OnHeader(const char *pName, const char *pValue);
54 void OnCompletionInternal(EHttpState State, const char *pErrorDetail);
55
56 static void FetchCallbackSuccess(emscripten_fetch_t *pFetch);
57 static void FetchCallbackFailure(emscripten_fetch_t *pFetch);
58 static void FetchCallbackProgress(emscripten_fetch_t *pFetch);
59};
60
61class CHttpEmscripten : public IEngineHttp
62{
63 friend CHttpRequestEmscripten;
64
65public:
66 // Lifecycle
67 bool Init(std::chrono::milliseconds ShutdownDelay) override;
68 void Shutdown() override;
69 ~CHttpEmscripten();
70
71 // User
72 void Run(std::shared_ptr<IHttpRequest> pRequest) override;
73 bool HasIpresolveBug() const override;
74
75private:
76 void *m_pThread = nullptr;
77
78 std::mutex m_Lock;
79 std::condition_variable m_ConditionVariableInit;
80 std::condition_variable m_ConditionVariableLoop;
81 std::atomic<bool> m_Initialized = false;
82 uint64_t m_NextRequestId = 0;
83 std::deque<std::shared_ptr<CHttpRequestEmscripten>> m_PendingRequests;
84 std::unordered_map<uint64_t, EHttpState> m_PendingFetchChanges;
85 std::unordered_map<uint64_t, std::shared_ptr<CHttpRequestEmscripten>> m_RunningRequests;
86 std::chrono::milliseconds m_ShutdownDelay{};
87 std::optional<std::chrono::time_point<std::chrono::steady_clock>> m_ShutdownTime;
88 std::atomic<bool> m_Shutdown = false;
89 std::atomic<bool> m_StartedShutdown = false;
90
91 static void ThreadMain(void *pUser);
92 void RunLoop();
93 void AddPendingStateChange(uint64_t RequestId, EHttpState State);
94};
95
96#endif // CONF_PLATFORM_EMSCRIPTEN
97#endif // ENGINE_SHARED_HTTP_EMSCRIPTEN_H
Definition http.h:266
Definition http.h:53
EHttpState
Definition http.h:21