yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
wasm_message_queue.h
Go to the documentation of this file.
1#ifndef YAZE_APP_PLATFORM_WASM_MESSAGE_QUEUE_H_
2#define YAZE_APP_PLATFORM_WASM_MESSAGE_QUEUE_H_
3
4#ifdef __EMSCRIPTEN__
5
6#include <emscripten.h>
7#include <emscripten/val.h>
8
9#include <chrono>
10#include <deque>
11#include <functional>
12#include <memory>
13#include <mutex>
14#include <string>
15#include <vector>
16
17#include "absl/status/status.h"
18#include "nlohmann/json.hpp"
19
20namespace yaze {
21namespace app {
22namespace platform {
23
31class WasmMessageQueue {
32 public:
36 struct QueuedMessage {
37 std::string message_type; // "change", "cursor", etc.
38 std::string payload; // JSON payload
39 double timestamp; // When message was queued
40 int retry_count = 0; // Number of send attempts
41 std::string id; // Unique message ID
42 };
43
47 struct QueueStatus {
48 size_t pending_count = 0;
49 size_t failed_count = 0;
50 size_t total_bytes = 0;
51 double oldest_message_age = 0; // Seconds
52 bool is_persisted = false;
53 };
54
55 // Callback types
56 using ReplayCompleteCallback = std::function<void(int replayed_count, int failed_count)>;
57 using MessageSender = std::function<absl::Status(const std::string& type, const std::string& payload)>;
58 using StatusChangeCallback = std::function<void(const QueueStatus& status)>;
59
62
69 std::string Enqueue(const std::string& message_type, const std::string& payload);
70
76 replay_complete_callback_ = callback;
77 }
78
84 status_change_callback_ = callback;
85 }
86
92 void ReplayAll(MessageSender sender, int max_retries = 3);
93
98 size_t PendingCount() const;
99
104 QueueStatus GetStatus() const;
105
109 void Clear();
110
114 void ClearFailed();
115
121 bool RemoveMessage(const std::string& message_id);
122
127 absl::Status PersistToStorage();
128
133 absl::Status LoadFromStorage();
134
139 void SetAutoPersist(bool enable) {
140 auto_persist_ = enable;
141 }
142
147 void SetMaxQueueSize(size_t max_size) {
148 max_queue_size_ = max_size;
149 }
150
155 void SetMessageExpiry(double seconds) {
156 message_expiry_seconds_ = seconds;
157 }
158
163 std::vector<QueuedMessage> GetQueuedMessages() const;
164
170
171 private:
172 // Generate unique message ID
173 std::string GenerateMessageId();
174
175 // Calculate total size of queued messages
176 size_t CalculateTotalBytes() const;
177
178 // Notify status change listeners
179 void NotifyStatusChange();
180
181 // Check if we should persist to storage
182 void MaybePersist();
183
184 // Message queue
185 std::deque<QueuedMessage> queue_;
186 std::vector<QueuedMessage> failed_messages_;
187 mutable std::mutex queue_mutex_;
188
189 // Configuration
190 bool auto_persist_ = true;
191 size_t max_queue_size_ = 1000;
192 double message_expiry_seconds_ = 86400.0; // 24 hours
193
194 // State tracking
195 bool is_replaying_ = false;
196 size_t total_enqueued_ = 0;
197 size_t total_replayed_ = 0;
198 size_t total_failed_ = 0;
199
200 // Callbacks
201 ReplayCompleteCallback replay_complete_callback_;
202 StatusChangeCallback status_change_callback_;
203
204 // Storage key for IndexedDB
205 static constexpr const char* kStorageKey = "collaboration_message_queue";
206};
207
208} // namespace platform
209} // namespace app
210} // namespace yaze
211
212#else // !__EMSCRIPTEN__
213
214// Stub implementation for non-WASM builds
215#include <deque>
216#include <functional>
217#include <string>
218#include <vector>
219
220#include "absl/status/status.h"
221
222namespace yaze {
223namespace app {
224namespace platform {
225
227 public:
229 std::string message_type;
230 std::string payload;
231 double timestamp;
232 int retry_count = 0;
233 std::string id;
234 };
235
236 struct QueueStatus {
237 size_t pending_count = 0;
238 size_t failed_count = 0;
239 size_t total_bytes = 0;
241 bool is_persisted = false;
242 };
243
244 using ReplayCompleteCallback = std::function<void(int, int)>;
245 using MessageSender = std::function<absl::Status(const std::string&, const std::string&)>;
246 using StatusChangeCallback = std::function<void(const QueueStatus&)>;
247
250
251 std::string Enqueue(const std::string&, const std::string&) { return ""; }
254 void ReplayAll(MessageSender, int = 3) {}
255 size_t PendingCount() const { return 0; }
256 QueueStatus GetStatus() const { return {}; }
257 void Clear() {}
258 void ClearFailed() {}
259 bool RemoveMessage(const std::string&) { return false; }
260 absl::Status PersistToStorage() {
261 return absl::UnimplementedError("Message queue requires WASM build");
262 }
263 absl::Status LoadFromStorage() {
264 return absl::UnimplementedError("Message queue requires WASM build");
265 }
266 void SetAutoPersist(bool) {}
267 void SetMaxQueueSize(size_t) {}
268 void SetMessageExpiry(double) {}
269 std::vector<QueuedMessage> GetQueuedMessages() const { return {}; }
270 int PruneExpiredMessages() { return 0; }
271};
272
273} // namespace platform
274} // namespace app
275} // namespace yaze
276
277#endif // __EMSCRIPTEN__
278
279#endif // YAZE_APP_PLATFORM_WASM_MESSAGE_QUEUE_H_
void SetOnStatusChange(StatusChangeCallback)
std::vector< QueuedMessage > GetQueuedMessages() const
std::function< void(int, int)> ReplayCompleteCallback
std::function< absl::Status(const std::string &, const std::string &)> MessageSender
std::function< void(const QueueStatus &)> StatusChangeCallback
void SetOnReplayComplete(ReplayCompleteCallback)
std::string Enqueue(const std::string &, const std::string &)