-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathApp.cpp
More file actions
109 lines (96 loc) · 1.97 KB
/
Copy pathApp.cpp
File metadata and controls
109 lines (96 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
*
* @file App.cpp
* @author Gaspard Kirira
*
* Copyright 2025, Gaspard Kirira. All rights reserved.
* https://github.com/vixcpp/vix
* Use of this source code is governed by a MIT license
* that can be found in the License file.
*
* Vix.cpp
*
*/
#include <vix/websocket/App.hpp>
#include <vix/websocket/protocol.hpp>
#include <stdexcept>
#include <utility>
namespace vix::websocket
{
App::App(
const std::string &configPath,
std::shared_ptr<vix::executor::RuntimeExecutor> executor)
: config_(configPath),
executor_(std::move(executor)),
server_(config_, executor_)
{
if (!executor_)
{
throw std::invalid_argument(
"vix::websocket::App requires a valid runtime executor");
}
install_dispatcher();
}
App::~App() noexcept
{
stop();
}
App &App::ws(const std::string &endpoint, TypedHandler handler)
{
routes_.push_back(Route{endpoint, std::move(handler)});
install_dispatcher();
return *this;
}
void App::install_dispatcher()
{
server_.on_typed_message(
[this](Session &session,
const std::string &type,
const vix::json::kvs &payload)
{
dispatch_typed_message(session, type, payload);
});
}
void App::dispatch_typed_message(
Session &session,
const std::string &type,
const vix::json::kvs &payload)
{
for (auto &route : routes_)
{
if (route.handler)
{
route.handler(session, type, payload);
}
}
}
void App::run_blocking()
{
server_.listen_blocking();
}
void App::stop() noexcept
{
std::lock_guard<std::mutex> lock(stopMutex_);
if (stopped_.exchange(true, std::memory_order_acq_rel))
{
return;
}
try
{
server_.stop();
}
catch (...)
{
}
try
{
if (executor_)
{
executor_->stop();
}
}
catch (...)
{
}
}
} // namespace vix::websocket