7#include <unordered_map>
20#ifdef WEBCFACE_COMPILER_IS_GCC
21#pragma GCC diagnostic push
22#pragma GCC diagnostic ignored "-Wabi"
24#include <spdlog/logger.h>
25#ifdef WEBCFACE_COMPILER_IS_GCC
26#pragma GCC diagnostic pop
41void wsThreadMain(
const std::shared_ptr<ClientData> &data);
46struct ClientData : std::enable_shared_from_this<ClientData> {
62 return base.
member_ == self_member_name;
68 bool current_curl_connected =
false;
69 void *current_curl_handle =
nullptr;
71 std::string current_ws_buf =
"";
92 struct SyncDataSnapshot {
93 std::chrono::system_clock::time_point time;
107 struct SyncDataFirst {
109 canvas3d_req, canvas2d_req, image_req, log_req;
111 bool ping_status_req;
112 SyncDataSnapshot sync_data;
118 std::atomic<bool> closing =
false;
125 bool connected =
false;
130 bool sync_init_end =
false;
137 bool do_ws_init =
false;
147 bool do_ws_recv =
false;
152 bool recv_ready =
false;
154 std::queue<std::vector<std::pair<int, std::shared_ptr<void>>>>
161 bool did_disconnect =
false;
175 std::queue<std::variant<std::string, SyncDataSnapshot>>
sync_queue;
183 std::atomic<bool> auto_reconnect =
true;
230 template <
typename T>
232 auto lock_ws = this->ws_data.
lock();
233 if (lock_ws->connected) {
234 this->logger_internal->debug(
"-> queued to send: {}", obj);
235 lock_ws->sync_queue.push(message::packSingle(obj));
236 lock_ws.cond().notify_all();
248 template <
typename T>
250 if (this->sync_data.
lock()->sync_first != std::nullopt) {
251 this->logger_internal->debug(
"-> queued to send: {}", obj);
252 auto lock_ws = this->ws_data.
lock();
253 lock_ws->sync_queue.push(message::packSingle(obj));
254 lock_ws.cond().notify_all();
265 template <
typename T>
267 this->logger_internal->debug(
"-> queued to send: {}", obj);
268 auto lock_ws = this->ws_data.
lock();
269 lock_ws->sync_queue.push(message::packSingle(obj));
270 lock_ws.cond().notify_all();
273 this->logger_internal->debug(
"-> sync data queued");
274 auto lock_ws = this->ws_data.
lock();
275 lock_ws->sync_queue.push(std::move(msg));
276 lock_ws.cond().notify_all();
279 std::string packSyncDataFirst(
const SyncDataFirst &data);
280 std::string packSyncData(std::stringstream &buffer,
int &len,
281 const SyncDataSnapshot &data);
302 void syncImpl(
bool sync,
bool forever,
303 std::optional<std::chrono::microseconds> timeout);
310 onRecv(
const std::vector<std::pair<
int, std::shared_ptr<void>>> &messages);
342 if (self_member_id && *self_member_id ==
id) {
343 return self_member_name;
346 for (
const auto &it : lock_member_ids.get()) {
347 if (it.second ==
id) {
355 if (name == self_member_name && self_member_id) {
356 return *self_member_id;
359 auto it = lock_member_ids->find(name);
360 if (it != lock_member_ids->end()) {
426 std::shared_ptr<std::unordered_map<unsigned int, int>> ping_status =
428 bool ping_status_req =
false;
433 void pingStatusReq();
Canvas2Dの送受信データを表すクラス
Definition canvas2d.h:24
Canvas3Dの送受信データを表すクラス
Definition canvas3d.h:28
関数1つを表すクラス
Definition func.h:95
(ver1.3から追加) 画像の送受信データを表すクラス
Definition image.h:20
ログの送受信データを表すクラス
Definition log.h:65
Memberを指すクラス
Definition member.h:23
RobotModelの送受信データを表すクラス
Definition robot_model.h:26
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:67
文字列の送受信データを表すクラス
Definition text.h:183
実数値またはその配列の送受信データを表すクラス
Definition value.h:59
文字列、数値などの型を送受信するクラス
Definition text.h:25
Viewの送受信データを表すクラス
Definition view.h:36
PromiseDataのリストを保持する。
Definition func_internal.h:88
RustのMutexのようにデータを保護するクラス
Definition mutex.h:49
ScopedLock< MutexProxy, std::unique_lock< std::mutex > > lock()
Definition mutex.h:58
ScopedLock< const SharedMutexProxy, std::shared_lock< std::shared_mutex > > shared_lock() const
Definition mutex.h:82
Definition data_store1.h:11
送受信するデータを保持するクラス
Definition data_store2.h:22
std::atomic< int > log_keep_lines
Definition log.cc:9
std::map< SharedString, T > StrMap1
Definition map.h:15
StrMap1< StrMap1< T > > StrMap2
Definition map.h:17
void wsThreadMain(const std::shared_ptr< ClientData > &data)
Definition client_threading.cc:88
std::string packSingle(const T &obj)
メッセージ1つを要素数2の配列としてシリアル化
Definition pack.h:48
メンバ名とデータ名を持つクラス
Definition field.h:38
SharedString member_
メンバー名
Definition field.h:43
Definition client_internal.h:185
std::optional< SyncDataFirst > sync_first
Definition client_internal.h:199
Definition client_internal.h:120
std::queue< std::vector< std::pair< int, std::shared_ptr< void > > > > recv_queue
Definition client_internal.h:155
std::queue< std::variant< std::string, SyncDataSnapshot > > sync_queue
送信したいメッセージを入れるキュー
Definition client_internal.h:175
Definition client_internal.h:46
FuncResultStore func_result_store
Definition client_internal.h:330
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Canvas2D)> > > > canvas2d_change_event
Definition client_internal.h:394
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Variant)> > > > text_change_event
Definition client_internal.h:384
unsigned int getMemberIdFromName(const SharedString &name) const
Definition client_internal.h:354
ClientData(const ClientData &)=delete
SharedMutexProxy< StrMap1< std::unique_ptr< std::wostream > > > logger_os_w
Definition client_internal.h:422
SyncDataStore2< std::shared_ptr< message::Canvas3DData > > canvas3d_store
Definition client_internal.h:326
std::thread ws_thread
websocket接続、通信するスレッド
Definition client_internal.h:83
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Member)> > > > ping_event
Definition client_internal.h:398
MutexProxy< SyncData > sync_data
Definition client_internal.h:222
std::optional< unsigned int > self_member_id
Definition client_internal.h:60
SyncDataStore2< std::shared_ptr< TextData > > text_store
Definition client_internal.h:321
MutexProxy< StrMap1< Queue< FuncCallHandle > > > func_listener_handlers
listenerがfetchするの待ちの関数呼び出しをためておく
Definition client_internal.h:336
SharedMutexProxy< std::string > svr_hostname
Definition client_internal.h:424
SharedMutexProxy< StrMap1< unsigned int > > member_ids
Definition client_internal.h:338
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Value)> > > > value_change_event
Definition client_internal.h:382
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Member)> > > > member_connected_event
Definition client_internal.h:379
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Text)> > > > text_entry_event
Definition client_internal.h:402
std::vector< char > curl_err_buffer
Definition client_internal.h:72
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Canvas2D)> > > > canvas2d_entry_event
Definition client_internal.h:414
std::shared_ptr< std::function< void(Member)> > member_entry_event
Definition client_internal.h:372
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(RobotModel)> > > > robot_model_change_event
Definition client_internal.h:388
bool isSelf(const FieldBase &base) const
Definition client_internal.h:61
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(View)> > > > view_change_event
Definition client_internal.h:390
std::string current_curl_path
Definition client_internal.h:70
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Canvas3D)> > > > canvas3d_entry_event
Definition client_internal.h:412
int port
Definition client_internal.h:67
SyncDataStore2< std::shared_ptr< LogData > > log_store
Definition client_internal.h:328
SyncDataStore2< std::shared_ptr< ValueData > > value_store
Definition client_internal.h:320
SyncDataStore2< ImageData, message::ImageReq > image_store
Definition client_internal.h:324
SharedString host
Definition client_internal.h:66
bool messagePushReq(const T &obj)
Definition client_internal.h:249
MutexProxy< WsData > ws_data
Definition client_internal.h:178
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Image)> > > > image_change_event
Definition client_internal.h:386
SharedString self_member_name
Client自身の名前
Definition client_internal.h:59
SharedMutexProxy< StrMap1< std::unique_ptr< std::ostream > > > logger_os
Definition client_internal.h:420
SharedMutexProxy< std::unordered_map< unsigned int, std::string > > member_addr
Definition client_internal.h:340
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Value)> > > > value_entry_event
Definition client_internal.h:400
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Func)> > > > func_entry_event
Definition client_internal.h:404
SyncDataStore1< std::chrono::system_clock::time_point > sync_time_store
Definition client_internal.h:329
SharedMutexProxy< StrMap1< std::unique_ptr< std::streambuf > > > logger_buf
Definition client_internal.h:419
ClientData & operator=(const ClientData &)=delete
SyncDataStore2< std::shared_ptr< FuncData > > func_store
Definition client_internal.h:322
const SharedString & getMemberNameFromId(unsigned int id) const
Definition client_internal.h:341
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Image)> > > > image_entry_event
Definition client_internal.h:408
SyncDataStore2< std::shared_ptr< message::Canvas2DData > > canvas2d_store
Definition client_internal.h:327
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(View)> > > > view_entry_event
Definition client_internal.h:406
SharedMutexProxy< StrMap1< std::unique_ptr< std::wstreambuf > > > logger_buf_w
Definition client_internal.h:421
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Canvas3D)> > > > canvas3d_change_event
Definition client_internal.h:392
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(Log)> > > > log_entry_event
Definition client_internal.h:416
SharedMutexProxy< StrMap1< std::shared_ptr< std::function< void(RobotModel)> > > > robot_model_entry_event
Definition client_internal.h:410
SyncDataStore2< std::shared_ptr< RobotModelData > > robot_model_store
Definition client_internal.h:325
SyncDataStore2< std::shared_ptr< message::ViewData > > view_store
Definition client_internal.h:323
void messagePushAlways(const T &obj)
Definition client_internal.h:266
std::shared_ptr< spdlog::logger > logger_internal
Definition client_internal.h:418
bool messagePushOnline(const T &obj)
Definition client_internal.h:231
SharedMutexProxy< StrMap1< bool > > member_entry
Definition client_internal.h:318
SharedMutexProxy< StrMap2< std::shared_ptr< std::function< void(Log)> > > > log_append_event
Definition client_internal.h:396
void messagePushAlways(SyncDataSnapshot &&msg)
Definition client_internal.h:272
#define WEBCFACE_NS_END
Definition webcface-config.h:118
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:117