Skip to content

Commit c41cf19

Browse files
authored
Major refactoring (#23)
1 parent 19ee9eb commit c41cf19

43 files changed

Lines changed: 2879 additions & 769 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

examples/http2_client.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ std::mutex g_mutex;
2727
std::condition_variable g_cv;
2828

2929
/// Perform HTTP/2 requests demonstrating various features
30-
coro::task<void> run_client(io::io_context& io_ctx, const std::string& base_url) {
30+
coro::task<void> run_client(const std::string& base_url) {
3131
// Create HTTP/2 client with custom config
3232
h2_client_config config;
3333
config.user_agent = "elio-http2-client-example/1.0";
3434
config.max_concurrent_streams = 100;
35-
36-
h2_client client(io_ctx, config);
35+
36+
h2_client client(config);
3737

3838
ELIO_LOG_INFO("=== HTTP/2 Client Example ===");
3939
ELIO_LOG_INFO("Base URL: {}", base_url);
@@ -89,11 +89,11 @@ coro::task<void> run_client(io::io_context& io_ctx, const std::string& base_url)
8989
}
9090

9191
/// Simple one-off HTTP/2 request demonstration
92-
coro::task<void> simple_request(io::io_context& io_ctx, const std::string& url) {
92+
coro::task<void> simple_request(const std::string& url) {
9393
ELIO_LOG_INFO("Fetching via HTTP/2: {}", url);
94-
94+
9595
// Use convenience function for one-off requests
96-
auto result = co_await h2_get(io_ctx, url);
96+
auto result = co_await h2_get(url);
9797

9898
if (result) {
9999
auto& resp = *result;
@@ -155,10 +155,10 @@ int main(int argc, char* argv[]) {
155155

156156
// Run appropriate mode
157157
if (full_demo) {
158-
auto task = run_client(io::default_io_context(), url);
158+
auto task = run_client(url);
159159
sched.spawn(task.release());
160160
} else {
161-
auto task = simple_request(io::default_io_context(), url);
161+
auto task = simple_request(url);
162162
sched.spawn(task.release());
163163
}
164164

examples/http_client.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ std::mutex g_mutex;
2525
std::condition_variable g_cv;
2626

2727
/// Perform multiple HTTP requests demonstrating various features
28-
coro::task<void> run_client(io::io_context& io_ctx, const std::string& base_url) {
28+
coro::task<void> run_client(const std::string& base_url) {
2929
// Create client with custom config
3030
client_config config;
3131
config.user_agent = "elio-http-client-example/1.0";
3232
config.follow_redirects = true;
3333
config.max_redirects = 5;
34-
35-
client c(io_ctx, config);
34+
35+
client c(config);
3636

3737
ELIO_LOG_INFO("=== HTTP Client Example ===");
3838
ELIO_LOG_INFO("Base URL: {}", base_url);
@@ -184,11 +184,11 @@ coro::task<void> run_client(io::io_context& io_ctx, const std::string& base_url)
184184
}
185185

186186
/// Simple one-off request demonstration
187-
coro::task<void> simple_request(io::io_context& io_ctx, const std::string& url) {
187+
coro::task<void> simple_request(const std::string& url) {
188188
ELIO_LOG_INFO("Fetching: {}", url);
189-
189+
190190
// Use convenience function for one-off requests
191-
auto result = co_await http::get(io_ctx, url);
191+
auto result = co_await http::get(url);
192192

193193
if (result) {
194194
auto& resp = *result;
@@ -240,10 +240,10 @@ int main(int argc, char* argv[]) {
240240

241241
// Run appropriate mode
242242
if (full_demo) {
243-
auto task = run_client(io::default_io_context(), url);
243+
auto task = run_client(url);
244244
sched.spawn(task.release());
245245
} else {
246-
auto task = simple_request(io::default_io_context(), url);
246+
auto task = simple_request(url);
247247
sched.spawn(task.release());
248248
}
249249

examples/http_server.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -268,30 +268,26 @@ int main(int argc, char* argv[]) {
268268
if (use_https) {
269269
try {
270270
auto tls_ctx = tls::tls_context::make_server(cert_file, key_file);
271-
271+
272272
auto server_task = srv.listen_tls(
273-
bind_addr,
274-
io::default_io_context(),
275-
sched,
273+
bind_addr,
276274
tls_ctx,
277275
opts
278276
);
279277
sched.spawn(server_task.release());
280-
278+
281279
ELIO_LOG_INFO("HTTPS server started on {}", bind_addr.to_string());
282280
} catch (const std::exception& e) {
283281
ELIO_LOG_ERROR("Failed to start HTTPS server: {}", e.what());
284282
return 1;
285283
}
286284
} else {
287285
auto server_task = srv.listen(
288-
bind_addr,
289-
io::default_io_context(),
290-
sched,
286+
bind_addr,
291287
opts
292288
);
293289
sched.spawn(server_task.release());
294-
290+
295291
ELIO_LOG_INFO("HTTP server started on {}", bind_addr.to_string());
296292
}
297293

examples/rpc_server_example.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,8 @@ task<void> signal_handler_task() {
188188
}
189189

190190
task<void> server_main(uint16_t port, [[maybe_unused]] scheduler& sched) {
191-
auto& ctx = io::default_io_context();
192-
193191
// Bind TCP listener
194-
auto listener_result = tcp_listener::bind(ipv4_address(port), ctx);
192+
auto listener_result = tcp_listener::bind(ipv4_address(port));
195193
if (!listener_result) {
196194
ELIO_LOG_ERROR("Failed to bind to port {}: {}", port, strerror(errno));
197195
co_return;

examples/sse_client.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,18 @@ std::mutex g_mutex;
3131
std::condition_variable g_cv;
3232

3333
/// Listen to SSE events
34-
coro::task<void> listen_events(io::io_context& io_ctx, const std::string& url) {
34+
coro::task<void> listen_events(const std::string& url) {
3535
ELIO_LOG_INFO("=== SSE Client Demo ===");
3636
ELIO_LOG_INFO("Connecting to: {}", url);
37-
37+
3838
// Configure client
3939
client_config config;
4040
config.user_agent = "elio-sse-demo/1.0";
4141
config.auto_reconnect = true;
4242
config.default_retry_ms = 3000;
4343
config.verify_certificate = false; // Allow self-signed certs for testing
44-
45-
sse_client client(io_ctx, config);
44+
45+
sse_client client(config);
4646

4747
// Connect
4848
bool connected = co_await client.connect(url);
@@ -105,10 +105,10 @@ coro::task<void> listen_events(io::io_context& io_ctx, const std::string& url) {
105105
}
106106

107107
/// Simple connection test
108-
coro::task<void> simple_test(io::io_context& io_ctx, const std::string& url) {
108+
coro::task<void> simple_test(const std::string& url) {
109109
ELIO_LOG_INFO("Simple SSE test: connecting to {}", url);
110-
111-
auto client_opt = co_await sse_connect(io_ctx, url);
110+
111+
auto client_opt = co_await sse_connect(url);
112112
if (!client_opt) {
113113
ELIO_LOG_ERROR("Failed to connect");
114114
{
@@ -145,15 +145,15 @@ coro::task<void> simple_test(io::io_context& io_ctx, const std::string& url) {
145145
}
146146

147147
/// Test reconnection behavior
148-
coro::task<void> reconnect_test(io::io_context& io_ctx, const std::string& url) {
148+
coro::task<void> reconnect_test(const std::string& url) {
149149
ELIO_LOG_INFO("Reconnection test: connecting to {}", url);
150-
150+
151151
client_config config;
152152
config.auto_reconnect = true;
153153
config.default_retry_ms = 2000;
154154
config.max_reconnect_attempts = 3;
155-
156-
sse_client client(io_ctx, config);
155+
156+
sse_client client(config);
157157

158158
if (!co_await client.connect(url)) {
159159
ELIO_LOG_ERROR("Initial connection failed");
@@ -240,17 +240,17 @@ int main(int argc, char* argv[]) {
240240
// Run client based on mode
241241
switch (mode) {
242242
case Mode::demo: {
243-
auto task = listen_events(io::default_io_context(), url);
243+
auto task = listen_events(url);
244244
sched.spawn(task.release());
245245
break;
246246
}
247247
case Mode::simple: {
248-
auto task = simple_test(io::default_io_context(), url);
248+
auto task = simple_test(url);
249249
sched.spawn(task.release());
250250
break;
251251
}
252252
case Mode::reconnect: {
253-
auto task = reconnect_test(io::default_io_context(), url);
253+
auto task = reconnect_test(url);
254254
sched.spawn(task.release());
255255
break;
256256
}

examples/sse_server.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,14 @@ class sse_http_server {
119119
explicit sse_http_server(router r, server_config config = {})
120120
: router_(std::move(r)), config_(config) {}
121121

122-
coro::task<void> listen(const net::ipv4_address& addr, io::io_context& io_ctx,
123-
runtime::scheduler& sched) {
124-
auto listener_result = net::tcp_listener::bind(addr, io_ctx);
122+
coro::task<void> listen(const net::ipv4_address& addr) {
123+
auto* sched = runtime::scheduler::current();
124+
if (!sched) {
125+
ELIO_LOG_ERROR("SSE server must be started from within a scheduler context");
126+
co_return;
127+
}
128+
129+
auto listener_result = net::tcp_listener::bind(addr);
125130
if (!listener_result) {
126131
ELIO_LOG_ERROR("Failed to bind SSE server: {}", strerror(errno));
127132
co_return;
@@ -142,7 +147,7 @@ class sse_http_server {
142147
}
143148

144149
auto handler = handle_connection(std::move(*stream_result));
145-
sched.spawn(handler.release());
150+
sched->spawn(handler.release());
146151
}
147152
}
148153

@@ -373,11 +378,7 @@ int main(int argc, char* argv[]) {
373378
sched.spawn(sig_handler.release());
374379

375380
// Start server
376-
auto server_task = srv.listen(
377-
net::ipv4_address(port),
378-
io::default_io_context(),
379-
sched
380-
);
381+
auto server_task = srv.listen(net::ipv4_address(port));
381382
sched.spawn(server_task.release());
382383

383384
ELIO_LOG_INFO("SSE server started on port {}", port);

examples/tcp_echo_server.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,8 @@ task<void> handle_client(tcp_stream stream, int client_id) {
9898

9999
/// Main server loop - accepts connections and spawns handlers
100100
task<void> server_main(const socket_address& bind_addr, const tcp_options& opts, scheduler& sched) {
101-
// Use the default io_context which is polled by scheduler workers
102-
auto& ctx = io::default_io_context();
103-
104101
// Bind TCP listener
105-
auto listener_result = tcp_listener::bind(bind_addr, ctx, opts);
102+
auto listener_result = tcp_listener::bind(bind_addr, opts);
106103
if (!listener_result) {
107104
ELIO_LOG_ERROR("Failed to bind to {}: {}", bind_addr.to_string(),
108105
strerror(errno));

examples/uds_echo_server.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,11 @@ task<void> handle_client(uds_stream stream, int client_id) {
8888

8989
/// Main server loop - accepts connections and spawns handlers
9090
task<void> server_main(const unix_address& addr, scheduler& sched) {
91-
// Use the default io_context which is polled by scheduler workers
92-
auto& ctx = io::default_io_context();
93-
9491
// Bind UDS listener
9592
uds_options opts;
9693
opts.unlink_on_bind = true; // Remove existing socket file if any
97-
98-
auto listener_result = uds_listener::bind(addr, ctx, opts);
94+
95+
auto listener_result = uds_listener::bind(addr, opts);
9996
if (!listener_result) {
10097
ELIO_LOG_ERROR("Failed to bind to {}: {}", addr.to_string(),
10198
strerror(errno));

examples/websocket_client.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,16 @@ coro::task<void> interactive_session(ws_client& client) {
7373
}
7474

7575
/// Demonstrate various WebSocket features
76-
coro::task<void> demo_features(io::io_context& io_ctx, const std::string& url) {
76+
coro::task<void> demo_features(const std::string& url) {
7777
ELIO_LOG_INFO("=== WebSocket Client Demo ===");
7878
ELIO_LOG_INFO("Connecting to: {}", url);
79-
79+
8080
// Configure client
8181
client_config config;
8282
config.user_agent = "elio-websocket-demo/1.0";
8383
config.verify_certificate = false; // Allow self-signed certs for testing
84-
85-
ws_client client(io_ctx, config);
84+
85+
ws_client client(config);
8686

8787
// Connect
8888
bool connected = co_await client.connect(url);
@@ -176,10 +176,10 @@ coro::task<void> demo_features(io::io_context& io_ctx, const std::string& url) {
176176
}
177177

178178
/// Simple echo test
179-
coro::task<void> echo_test(io::io_context& io_ctx, const std::string& url) {
179+
coro::task<void> echo_test(const std::string& url) {
180180
ELIO_LOG_INFO("Echo test: connecting to {}", url);
181-
182-
auto client_opt = co_await ws_connect(io_ctx, url);
181+
182+
auto client_opt = co_await ws_connect(url);
183183
if (!client_opt) {
184184
ELIO_LOG_ERROR("Failed to connect");
185185
{
@@ -262,10 +262,10 @@ int main(int argc, char* argv[]) {
262262

263263
// Run client
264264
if (demo_mode) {
265-
auto task = demo_features(io::default_io_context(), url);
265+
auto task = demo_features(url);
266266
sched.spawn(task.release());
267267
} else {
268-
auto task = echo_test(io::default_io_context(), url);
268+
auto task = echo_test(url);
269269
sched.spawn(task.release());
270270
}
271271

examples/websocket_server.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,11 +316,7 @@ int main(int argc, char* argv[]) {
316316
sched.spawn(sig_handler.release());
317317

318318
// Start server
319-
auto server_task = srv.listen(
320-
net::ipv4_address(port),
321-
io::default_io_context(),
322-
sched
323-
);
319+
auto server_task = srv.listen(net::ipv4_address(port));
324320
sched.spawn(server_task.release());
325321

326322
ELIO_LOG_INFO("WebSocket server started on port {}", port);

0 commit comments

Comments
 (0)