Skip to content

Commit

Permalink
Add ASIO Socket Transport Implementation (#21)
Browse files Browse the repository at this point in the history
* Add socket transport implementation

* Add framed socket transport implementation
  • Loading branch information
hankhsu1996 authored Aug 7, 2024
1 parent 5d0149a commit 1ac4ac2
Show file tree
Hide file tree
Showing 29 changed files with 599 additions and 429 deletions.
10 changes: 10 additions & 0 deletions .clangd
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CompileFlags:
Add:
- "-std=c++20"
- "-Wall"
- "-Wextra"
CompilationDatabase: build/Release

Diagnostics:
ClangTidy:
Remove: bugprone-unused-return-value
12 changes: 12 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,17 @@ target_link_libraries(framed_pipe_client PRIVATE jsonrpc)
add_executable(framed_pipe_server examples/framed_pipe_server.cpp)
target_link_libraries(framed_pipe_server PRIVATE jsonrpc)

add_executable(socket_client examples/socket_client.cpp)
target_link_libraries(socket_client PRIVATE jsonrpc)

add_executable(socket_server examples/socket_server.cpp)
target_link_libraries(socket_server PRIVATE jsonrpc)

add_executable(framed_socket_client examples/framed_socket_client.cpp)
target_link_libraries(framed_socket_client PRIVATE jsonrpc)

add_executable(framed_socket_server examples/framed_socket_server.cpp)
target_link_libraries(framed_socket_server PRIVATE jsonrpc)

enable_testing()
add_subdirectory(tests)
25 changes: 14 additions & 11 deletions MODULE.bazel
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
"""This is the MODULE.bazel file for the jsonrpc module."""
"""
MODULE.bazel file for the jsonrpc module
"""

module(
name = "jsonrpc",
version = "1.0.0",
)

# Register the rules_foreign_cc and rules_cc dependencies
bazel_dep(name = "rules_foreign_cc", version = "0.11.1")
# Dependencies from the Bazel Central Registry
bazel_dep(name = "rules_cc", version = "0.0.9")

# Register the nlohmann_json dependency
bazel_dep(name = "nlohmann_json", version = "3.11.3")

# Register the spdlog dependency
bazel_dep(name = "spdlog", version = "1.14.1")

# Register the asio dependency
bazel_dep(name = "asio", version = "1.28.2")

# Register the catch2 dependency
bazel_dep(name = "catch2", version = "3.6.0")

# Dependency using traditional HTTP archive
http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "thread_pool",
build_file = "//third_party/thread_pool:BUILD.bazel",
sha256 = "be7abecbc420bb87919eeef729b13ff7c29d5ce547bdae284923296c695415bd",
strip_prefix = "thread-pool-4.1.0",
urls = ["https://github.com/bshoshany/thread-pool/archive/refs/tags/v4.1.0.tar.gz"],
)
391 changes: 1 addition & 390 deletions MODULE.bazel.lock

Large diffs are not rendered by default.

9 changes: 0 additions & 9 deletions WORKSPACE.bazel
Original file line number Diff line number Diff line change
@@ -1,9 +0,0 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
name = "thread_pool",
build_file = "//third_party/thread_pool:BUILD.bazel",
sha256 = "be7abecbc420bb87919eeef729b13ff7c29d5ce547bdae284923296c695415bd",
strip_prefix = "thread-pool-4.1.0",
urls = ["https://github.com/bshoshany/thread-pool/archive/refs/tags/v4.1.0.tar.gz"],
)
65 changes: 65 additions & 0 deletions examples/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# examples/BUILD

# Standard I/O examples
cc_binary(
name = "stdio_client",
srcs = ["stdio_client.cpp"],
Expand All @@ -14,3 +15,67 @@ cc_binary(
],
deps = ["//src:jsonrpc_lib"],
)

# Unix domain socket examples
cc_binary(
name = "pipe_client",
srcs = ["pipe_client.cpp"],
deps = ["//src:jsonrpc_lib"],
)

cc_binary(
name = "pipe_server",
srcs = [
"calculator.hpp",
"pipe_server.cpp",
],
deps = ["//src:jsonrpc_lib"],
)

# Framed Unix domain socket examples
cc_binary(
name = "framed_pipe_client",
srcs = ["framed_pipe_client.cpp"],
deps = ["//src:jsonrpc_lib"],
)

cc_binary(
name = "framed_pipe_server",
srcs = [
"calculator.hpp",
"framed_pipe_server.cpp",
],
deps = ["//src:jsonrpc_lib"],
)

# Socket examples
cc_binary(
name = "socket_client",
srcs = ["socket_client.cpp"],
deps = ["//src:jsonrpc_lib"],
)

cc_binary(
name = "socket_server",
srcs = [
"calculator.hpp",
"socket_server.cpp",
],
deps = ["//src:jsonrpc_lib"],
)

# Framed socket examples
cc_binary(
name = "framed_socket_client",
srcs = ["framed_socket_client.cpp"],
deps = ["//src:jsonrpc_lib"],
)

cc_binary(
name = "framed_socket_server",
srcs = [
"calculator.hpp",
"framed_socket_server.cpp",
],
deps = ["//src:jsonrpc_lib"],
)
1 change: 0 additions & 1 deletion examples/framed_pipe_client.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#include <iostream>
#include <memory>

#include <jsonrpc/client/client.hpp>
Expand Down
37 changes: 37 additions & 0 deletions examples/framed_socket_client.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include <memory>

#include <jsonrpc/client/client.hpp>
#include <jsonrpc/transport/framed_pipe_transport.hpp>
#include <nlohmann/json.hpp>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/spdlog.h>

#include "jsonrpc/transport/framed_socket_transport.hpp"

using namespace jsonrpc::client;
using namespace jsonrpc::transport;
using Json = nlohmann::json;

int main() {
auto logger = spdlog::basic_logger_mt("client", "logs/client.log", true);
spdlog::set_default_logger(logger);
spdlog::set_level(spdlog::level::debug);
spdlog::flush_on(spdlog::level::debug);

std::string host = "127.0.0.1";
uint16_t port = 12345;
auto transport = std::make_unique<FramedSocketTransport>(host, port, false);
Client client(std::move(transport));
client.Start();

Json addRes = client.SendMethodCall("add", Json({{"a", 10}, {"b", 5}}));
spdlog::info("Add result: {}", addRes.dump());

Json divRes = client.SendMethodCall("divide", Json({{"a", 10}, {"b", 0}}));
spdlog::info("Divide result: {}", divRes.dump());

client.SendNotification("stop");

client.Stop();
return 0;
}
44 changes: 44 additions & 0 deletions examples/framed_socket_server.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#include <memory>

#include <jsonrpc/server/server.hpp>
#include <jsonrpc/transport/framed_pipe_transport.hpp>
#include <nlohmann/json.hpp>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/spdlog.h>

#include "jsonrpc/transport/framed_socket_transport.hpp"

#include "calculator.hpp"

using namespace jsonrpc::server;
using namespace jsonrpc::transport;
using Json = nlohmann::json;

int main() {
auto logger = spdlog::basic_logger_mt("server", "logs/server.log", true);
spdlog::set_default_logger(logger);
spdlog::set_level(spdlog::level::debug);
spdlog::flush_on(spdlog::level::debug);

std::string host = "0.0.0.0";
uint16_t port = 12345;
auto transport = std::make_unique<FramedSocketTransport>(host, port, true);
Server server(std::move(transport));
Calculator calculator;

server.RegisterMethodCall(
"add", [&calculator](const std::optional<Json> &params) {
return calculator.Add(params.value());
});

server.RegisterMethodCall(
"divide", [&calculator](const std::optional<Json> &params) {
return calculator.Divide(params.value());
});

server.RegisterNotification(
"stop", [&server](const std::optional<Json> &) { server.Stop(); });

server.Start();
return 0;
}
1 change: 0 additions & 1 deletion examples/pipe_client.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#include <iostream>
#include <memory>

#include <jsonrpc/client/client.hpp>
Expand Down
35 changes: 35 additions & 0 deletions examples/socket_client.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include <memory>

#include <jsonrpc/client/client.hpp>
#include <jsonrpc/transport/socket_transport.hpp>
#include <nlohmann/json.hpp>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/spdlog.h>

using namespace jsonrpc::client;
using namespace jsonrpc::transport;
using Json = nlohmann::json;

int main() {
auto logger = spdlog::basic_logger_mt("client", "logs/client.log", true);
spdlog::set_default_logger(logger);
spdlog::set_level(spdlog::level::debug);
spdlog::flush_on(spdlog::level::debug);

std::string host = "127.0.0.1";
uint16_t port = 12345;
auto transport = std::make_unique<SocketTransport>(host, port, false);
Client client(std::move(transport));
client.Start();

Json addRes = client.SendMethodCall("add", Json({{"a", 10}, {"b", 5}}));
spdlog::info("Add result: {}", addRes.dump());

Json divRes = client.SendMethodCall("divide", Json({{"a", 10}, {"b", 0}}));
spdlog::info("Divide result: {}", divRes.dump());

client.SendNotification("stop");

client.Stop();
return 0;
}
43 changes: 43 additions & 0 deletions examples/socket_server.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include <memory>

#include <jsonrpc/server/server.hpp>
#include <jsonrpc/transport/socket_transport.hpp>
#include <nlohmann/json.hpp>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/spdlog.h>

#include "calculator.hpp"

using namespace jsonrpc::server;
using namespace jsonrpc::transport;
using Json = nlohmann::json;

int main() {
auto logger = spdlog::basic_logger_mt("server", "logs/server.log", true);
spdlog::set_default_logger(logger);
spdlog::set_level(spdlog::level::debug);
spdlog::flush_on(spdlog::level::debug);

std::string host = "0.0.0.0";
uint16_t port = 12345;

auto transport = std::make_unique<SocketTransport>(host, port, true);
Server server(std::move(transport));
Calculator calculator;

server.RegisterMethodCall(
"add", [&calculator](const std::optional<Json> &params) {
return calculator.Add(params.value());
});

server.RegisterMethodCall(
"divide", [&calculator](const std::optional<Json> &params) {
return calculator.Divide(params.value());
});

server.RegisterNotification(
"stop", [&server](const std::optional<Json> &) { server.Stop(); });

server.Start();
return 0;
}
1 change: 0 additions & 1 deletion examples/stdio_client.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#include <iostream>
#include <memory>

#include <jsonrpc/client/client.hpp>
Expand Down
1 change: 0 additions & 1 deletion include/jsonrpc/client/client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include <string>
#include <thread>
#include <unordered_map>
#include <vector>

#include <nlohmann/json.hpp>

Expand Down
1 change: 0 additions & 1 deletion include/jsonrpc/client/request.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include <functional>
#include <optional>
#include <string>
#include <vector>

#include <nlohmann/json.hpp>

Expand Down
1 change: 0 additions & 1 deletion include/jsonrpc/transport/framed_pipe_transport.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

#include "jsonrpc/transport/framed_transport.hpp"
#include "jsonrpc/transport/pipe_transport.hpp"
#include "jsonrpc/transport/transport.hpp"

namespace jsonrpc {
namespace transport {
Expand Down
27 changes: 27 additions & 0 deletions include/jsonrpc/transport/framed_socket_transport.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#pragma once

#include <asio.hpp>
#include <asio/local/stream_protocol.hpp>
#include <cstdint>
#include <string>

#include "jsonrpc/transport/framed_transport.hpp"
#include "jsonrpc/transport/socket_transport.hpp"

namespace jsonrpc::transport {

/**
* @brief Transport layer using Asio sockets for JSON-RPC
* communication with framing.
*/
class FramedSocketTransport :
public SocketTransport,
protected FramedTransport {
public:
FramedSocketTransport(const std::string &host, uint16_t port, bool isServer);

void SendMessage(const std::string &message) override;
std::string ReceiveMessage() override;
};

} // namespace jsonrpc::transport
Loading

0 comments on commit 1ac4ac2

Please sign in to comment.