{"id":15047752,"url":"https://github.com/tradias/asio-grpc","last_synced_at":"2025-04-06T14:12:56.143Z","repository":{"id":37864544,"uuid":"393616798","full_name":"Tradias/asio-grpc","owner":"Tradias","description":"Asynchronous gRPC with Asio/unified executors","archived":false,"fork":false,"pushed_at":"2024-04-08T16:06:23.000Z","size":4423,"stargazers_count":321,"open_issues_count":2,"forks_count":28,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-04-09T08:41:54.759Z","etag":null,"topics":["asio","asynchronous","asynchronous-programming","coroutine","cpp","cpp17","cpp20","executors","grpc","sender-reciever"],"latest_commit_sha":null,"homepage":"https://tradias.github.io/asio-grpc/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tradias.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2021-08-07T07:46:51.000Z","updated_at":"2024-04-15T16:03:36.918Z","dependencies_parsed_at":"2023-10-21T20:32:28.261Z","dependency_job_id":"fdbb9711-f0da-4991-878a-cf292255fc51","html_url":"https://github.com/Tradias/asio-grpc","commit_stats":null,"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tradias%2Fasio-grpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tradias%2Fasio-grpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tradias%2Fasio-grpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tradias%2Fasio-grpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tradias","download_url":"https://codeload.github.com/Tradias/asio-grpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247492566,"owners_count":20947545,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asio","asynchronous","asynchronous-programming","coroutine","cpp","cpp17","cpp20","executors","grpc","sender-reciever"],"created_at":"2024-09-24T21:04:10.706Z","updated_at":"2025-04-06T14:12:56.116Z","avatar_url":"https://github.com/Tradias.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# asio-grpc\n\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=Tradias_asio-grpc\u0026metric=reliability_rating)](https://sonarcloud.io/summary/overall?id=Tradias_asio-grpc) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Tradias_asio-grpc\u0026metric=coverage)](https://sonarcloud.io/summary/overall?id=Tradias_asio-grpc) [![vcpkg](https://repology.org/badge/version-for-repo/vcpkg/asio-grpc.svg?header=vcpkg)](https://repology.org/project/asio-grpc/versions) [![conan](https://repology.org/badge/version-for-repo/conancenter/asio-grpc.svg?header=conan)](https://repology.org/project/asio-grpc/versions) [![hunter](https://img.shields.io/badge/hunter-asio_grpc-green.svg)](https://hunter.readthedocs.io/en/latest/packages/pkg/asio-grpc.html)\n\nAn [Executor, Networking TS](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/Executor1.html#boost_asio.reference.Executor1.standard_executors) and [std::execution](http://wg21.link/p2300) interface to [grpc::CompletionQueue](https://grpc.github.io/grpc/cpp/classgrpc_1_1_completion_queue.html) for writing asynchronous [gRPC](https://grpc.io/) clients and servers using C++20 coroutines, Boost.Coroutines, Asio's stackless coroutines, callbacks, sender/receiver and more.\n\n# Features\n\n* Asio [ExecutionContext](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/ExecutionContext.html) compatible wrapper around [grpc::CompletionQueue](https://grpc.github.io/grpc/cpp/classgrpc_1_1_completion_queue.html)\n* Support for all RPC types: unary, client-streaming, server-streaming and bidirectional-streaming with any mix of Asio [CompletionToken](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/asynchronous_operations.html#boost_asio.reference.asynchronous_operations.completion_tokens_and_handlers) as well as [Sender](https://github.com/facebookexperimental/libunifex/blob/main/doc/concepts.md#sender-concept), including allocator customization\n* Support for asynchronously waiting for [grpc::Alarms](https://grpc.github.io/grpc/cpp/classgrpc_1_1_alarm.html) including cancellation through [cancellation_slots](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/cancellation_slot.html) and [StopTokens](https://github.com/facebookexperimental/libunifex/blob/main/doc/concepts.md#stoptoken-concept)\n* Support for sender/receiver through either [libunifex](https://github.com/facebookexperimental/libunifex) or [stdexec](https://github.com/NVIDIA/stdexec)\n* Support for generic gRPC clients and servers\n* No extra codegen required, works with the vanilla gRPC C++ plugin (`grpc_cpp_plugin`)\n* No-Boost version with [standalone Asio](https://github.com/chriskohlhoff/asio)\n* No-Asio version with [libunifex](https://github.com/facebookexperimental/libunifex) or [stdexec](https://github.com/NVIDIA/stdexec)\n* CMake function to easily generate gRPC source files: [asio_grpc_protobuf_generate](/cmake/AsioGrpcProtobufGenerator.cmake)\n\n# Example\n\nHello world client using C++20 coroutines. Other Asio completion tokens are supported as well.\n\n\u003c!-- snippet: client-side-hello-world --\u003e\n\u003ca id='snippet-client-side-hello-world'\u003e\u003c/a\u003e\n```cpp\nhelloworld::Greeter::Stub stub(grpc::CreateChannel(\"localhost:50051\", grpc::InsecureChannelCredentials()));\nagrpc::GrpcContext grpc_context;\nasio::co_spawn(\n    grpc_context,\n    [\u0026]() -\u003e asio::awaitable\u003cvoid\u003e\n    {\n        using RPC = agrpc::ClientRPC\u003c\u0026helloworld::Greeter::Stub::PrepareAsyncSayHello\u003e;\n        grpc::ClientContext client_context;\n        helloworld::HelloRequest request;\n        request.set_name(\"world\");\n        helloworld::HelloReply response;\n        const grpc::Status status =\n            co_await RPC::request(grpc_context, stub, client_context, request, response, asio::use_awaitable);\n        assert(status.ok());\n    },\n    asio::detached);\ngrpc_context.run();\n```\n\u003csup\u003e\u003ca href='/example/snippets/client.cpp#L83-L101' title='Snippet source file'\u003esnippet source\u003c/a\u003e | \u003ca href='#snippet-client-side-hello-world' title='Start of snippet'\u003eanchor\u003c/a\u003e\u003c/sup\u003e\n\u003c!-- endSnippet --\u003e\n\n# Requirements\n\nAsio-grpc is a C++17, header-only library. To install it, CMake (3.14+) is all that is needed.\n\nTo use it, [gRPC](https://grpc.io/) and either [Boost.Asio](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio.html) (min. 1.74.0), [standalone Asio](https://github.com/chriskohlhoff/asio) (min. 1.17.0), [libunifex](https://github.com/facebookexperimental/libunifex) or [stdexec](https://github.com/NVIDIA/stdexec) must be present and linked into your application.\n\nOfficially supported compilers are GCC 8+, Clang 10+, AppleClang 15+ and latest MSVC.\n\n# Usage\n\nThe library can be added to a CMake project using either `add_subdirectory` or `find_package`. Once set up, include the individual headers from the `agrpc` directory or the convenience header:\n\n```cpp\n#include \u003cagrpc/asio_grpc.hpp\u003e\n```\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003evcpkg\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\nAdd [asio-grpc](https://github.com/microsoft/vcpkg/blob/master/ports/asio-grpc/vcpkg.json) to the dependencies inside your `vcpkg.json`: \n\n```jsonc\n{\n    \"name\": \"your_app\",\n    \"version\": \"0.1.0\",\n    \"dependencies\": [\n        \"asio-grpc\",\n        // To use the Boost.Asio backend add\n        // \"boost-asio\",\n        // To use the standalone Asio backend add\n        // \"asio\",\n        // To use the libunifex backend add\n        // \"libunifex\",\n        // To use the stdexec backend add\n        // \"stdexec\"\n    ]\n}\n```\n\nFind asio-grpc and link it to your target.\n\nUsing [Boost.Asio](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio.html):\n\n```cmake\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(Boost REQUIRED)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc Boost::headers)\n```\n\nOr using [standalone Asio](https://github.com/chriskohlhoff/asio):\n\n```cmake\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(asio CONFIG REQUIRED)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-standalone-asio asio::asio)\n```\n\nOr using [libunifex](https://github.com/facebookexperimental/libunifex):\n\n```cmake\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(unifex CONFIG REQUIRED)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-unifex unifex::unifex)\n```\n\nOr using [stdexec](https://github.com/NVIDIA/stdexec):\n\n```cmake\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(stdexec CONFIG REQUIRED)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-stdexec STDEXEC::stdexec)\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eHunter\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\nSee asio-grpc's documentation on the Hunter website: [https://hunter.readthedocs.io/en/latest/packages/pkg/asio-grpc.html](https://hunter.readthedocs.io/en/latest/packages/pkg/asio-grpc.html).\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003econan\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\nThe recipe in conan-center is called [asio-grpc](https://conan.io/center/recipes/asio-grpc).   \nIf you are using conan's CMake generator then link with `asio-grpc::asio-grpc` independent of the backend that you choose:\n\n```cmake\nfind_package(asio-grpc)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc)\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eCMake package\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\nClone the repository and install it.\n\n```shell\ncmake -B build -DCMAKE_INSTALL_PREFIX=/desired/installation/directory .\ncmake --build build --target install\n```\n\nLocate it and link it to your target.\n\nUsing [Boost.Asio](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio.html):\n\n```cmake\n# Make sure CMAKE_PREFIX_PATH contains /desired/installation/directory\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(Boost)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc Boost::headers)\n```\n\nOr using [standalone Asio](https://github.com/chriskohlhoff/asio):\n\n```cmake\n# Make sure CMAKE_PREFIX_PATH contains /desired/installation/directory\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(asio)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-standalone-asio asio::asio)\n```\n\nOr using [libunifex](https://github.com/facebookexperimental/libunifex):\n\n```cmake\n# Make sure CMAKE_PREFIX_PATH contains /desired/installation/directory\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(unifex)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-unifex unifex::unifex)\n```\n\nOr using [stdexec](https://github.com/NVIDIA/stdexec):\n\n```cmake\n# Make sure CMAKE_PREFIX_PATH contains /desired/installation/directory\nfind_package(asio-grpc CONFIG REQUIRED)\nfind_package(stdexec)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-stdexec STDEXEC::stdexec)\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eCMake subdirectory\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\nClone the repository into a subdirectory of your CMake project. Then add it and link it to your target.\n\nIndependent of the backend you chose, find and link with gRPC:\n\n```cmake\nfind_package(gRPC)\ntarget_link_libraries(your_app PUBLIC gRPC::grpc++)\n```\n\nUsing [Boost.Asio](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio.html):\n\n```cmake\nadd_subdirectory(/path/to/asio-grpc SYSTEM)\nfind_package(Boost)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc Boost::headers)\n```\n\nOr using [standalone Asio](https://github.com/chriskohlhoff/asio):\n\n```cmake\nadd_subdirectory(/path/to/asio-grpc SYSTEM)\nfind_package(asio)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-standalone-asio asio::asio)\n```\n\nOr using [libunifex](https://github.com/facebookexperimental/libunifex):\n\n```cmake\nadd_subdirectory(/path/to/asio-grpc SYSTEM)\nfind_package(unifex)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-unifex unifex::unifex)\n```\n\nOr using [stdexec](https://github.com/NVIDIA/stdexec):\n\n```cmake\nadd_subdirectory(/path/to/asio-grpc SYSTEM)\nfind_package(stdexec)\ntarget_link_libraries(your_app PUBLIC asio-grpc::asio-grpc-stdexec STDEXEC::stdexec)\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRaw source code\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\nThis type of usage is unsupported. Future versions of asio-grpc might break it without notice.\n\nCopy the contents of the `src/` directory into your project and add it to your project's include directories. Depending on your desired backend: Boost.Asio, \nstandalone Asio, libunifex or stdexec, set the preprocessor definitions `AGRPC_BOOST_ASIO`, `AGRPC_STANDALONE_ASIO`, `AGRPC_UNIFEX` or `AGRPC_STDEXEC` respectively. Also make sure that \nthe backend's header files and libraries can be found correctly.\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n## CMake Options\n\n`ASIO_GRPC_DISABLE_AUTOLINK` - Set before using `find_package(asio-grpc)` to prevent `asio-grpcConfig.cmake` from finding and setting up interface link libraries like `gRPC::grpc++`.\n\n# Performance\n\nasio-grpc is part of [grpc_bench](https://github.com/Tradias/grpc_bench). Head over there to compare its performance against other libraries and languages.\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eResults\u003c/b\u003e\u003c/summary\u003e\n\u003cp\u003e\n\nBelow are the results from the helloworld unary RPC for:   \nIntel(R) Core(TM) i7-8750H CPU @ 2.20GHz   \nLinux, GCC 12.2.0, Boost 1.80.0, gRPC 1.52.1, asio-grpc v2.5.0, jemalloc 5.2.1   \nRequest scenario: string_100B\n\n### 1 CPU server\n\n| name                        |   req/s |   avg. latency |        90 % in |        95 % in |        99 % in | avg. cpu |   avg. memory |\n|-----------------------------|--------:|---------------:|---------------:|---------------:|---------------:|---------:|--------------:|\n| rust_thruster_mt            |   48796 |       20.19 ms |        9.42 ms |       12.11 ms |      516.23 ms |  104.51% |     12.06 MiB |\n| rust_tonic_mt               |   43343 |       22.86 ms |       10.42 ms |       11.29 ms |      662.73 ms |  102.29% |     14.39 MiB |\n| go_grpc                     |   38541 |       25.33 ms |       38.74 ms |       42.98 ms |       53.94 ms |   100.0% |     25.19 MiB |\n| rust_grpcio                 |   34757 |       28.65 ms |       30.18 ms |       30.60 ms |       31.68 ms |  101.91% |     18.59 MiB |\n| cpp_grpc_mt                 |   33433 |       29.77 ms |       31.56 ms |       32.07 ms |       33.58 ms |  102.22% |      5.69 MiB |\n| cpp_asio_grpc_callback      |   32521 |       30.61 ms |       32.54 ms |       33.14 ms |       35.29 ms |  101.65% |      5.93 MiB |\n| cpp_asio_grpc_unifex        |   32507 |       30.62 ms |       32.50 ms |       32.99 ms |       34.66 ms |  102.94% |      5.81 MiB |\n| cpp_asio_grpc_coroutine     |   28893 |       34.47 ms |       36.78 ms |       37.37 ms |       38.88 ms |  102.52% |      5.56 MiB |\n| cpp_asio_grpc_io_context_coro |   28072 |       35.47 ms |       37.77 ms |       38.22 ms |       39.93 ms |   77.73% |      5.39 MiB |\n| cpp_grpc_callback           |   10243 |       90.44 ms |      118.77 ms |      164.20 ms |      175.43 ms |  100.62% |      44.9 MiB |\n\n### 2 CPU server\n\n| name                        |   req/s |   avg. latency |        90 % in |        95 % in |        99 % in | avg. cpu |   avg. memory |\n|-----------------------------|--------:|---------------:|---------------:|---------------:|---------------:|---------:|--------------:|\n| cpp_grpc_mt                 |   87550 |        9.66 ms |       15.11 ms |       18.23 ms |       27.03 ms |  204.66% |     26.15 MiB |\n| cpp_asio_grpc_unifex        |   86568 |        9.83 ms |       15.34 ms |       18.55 ms |       27.12 ms |  207.78% |     27.54 MiB |\n| cpp_asio_grpc_callback      |   85292 |       10.03 ms |       15.38 ms |       18.51 ms |       26.62 ms |  206.63% |     24.73 MiB |\n| cpp_asio_grpc_coroutine     |   79647 |       11.04 ms |       18.01 ms |       21.08 ms |       28.67 ms |  212.19% |     25.04 MiB |\n| cpp_asio_grpc_io_context_coro |   77953 |       11.24 ms |       18.32 ms |       21.61 ms |       29.20 ms |  161.24% |      28.4 MiB |\n| rust_thruster_mt            |   75793 |       11.90 ms |       26.84 ms |       40.49 ms |       59.71 ms |  186.64% |     13.85 MiB |\n| cpp_grpc_callback           |   68203 |       12.24 ms |       23.93 ms |       28.62 ms |       41.83 ms |  206.38% |     52.79 MiB |\n| rust_tonic_mt               |   67162 |       13.85 ms |       34.05 ms |       46.31 ms |       69.58 ms |  206.13% |     17.24 MiB |\n| rust_grpcio                 |   60775 |       15.49 ms |       22.85 ms |       25.77 ms |       31.14 ms |  218.05% |     30.15 MiB |\n| go_grpc                     |   58192 |       15.87 ms |       24.31 ms |       27.10 ms |       32.43 ms |  197.71% |     25.06 MiB |\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n# Documentation\n\n[**Documentation**](https://tradias.github.io/asio-grpc/) | [**Examples**](/example)\n\nThe main workhorses of this library are the [agrpc::GrpcContext](https://tradias.github.io/asio-grpc/classagrpc_1_1_grpc_context.html) and its `executor_type` - [agrpc::GrpcExecutor](https://tradias.github.io/asio-grpc/classagrpc_1_1_basic_grpc_executor.html). \n\nThe [agrpc::GrpcContext](https://tradias.github.io/asio-grpc/classagrpc_1_1_grpc_context.html) implements [asio::execution_context](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/execution_context.html) and can be used as an argument to Asio functions that expect an `ExecutionContext` like [asio::spawn](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/spawn/overload2.html).\n\nLikewise, the [agrpc::GrpcExecutor](https://tradias.github.io/asio-grpc/classagrpc_1_1_basic_grpc_executor.html) satisfies the [Executor and Networking TS](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/Executor1.html#boost_asio.reference.Executor1.standard_executors) and [Scheduler](https://github.com/facebookexperimental/libunifex/blob/main/doc/concepts.md#scheduler) requirements and can therefore be used in places where Asio/libunifex expects an `Executor` or `Scheduler`.\n\nThe API for RPCs is modeled after the asynchronous, tag-based API of gRPC. As an example, the equivalent for `grpc::ClientAsyncReader\u003chelloworld::HelloReply\u003e.Read(helloworld::HelloReply*, void*)` would be `agrpc::ClientRPC.read(helloworld::HelloReply\u0026, CompletionToken)`.\n\nInstead of the `void*` tag in the gRPC API the functions in this library expect a [CompletionToken](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/asynchronous_operations.html#boost_asio.reference.asynchronous_operations.completion_tokens_and_handlers). Asio comes with several CompletionTokens already: [C++20 coroutine](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/use_awaitable.html), [stackless coroutine](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/coroutine.html), callback and [Boost.Coroutine](https://www.boost.org/doc/libs/1_86_0/doc/html/boost_asio/reference/basic_yield_context.html). There is also a special token called `agrpc::use_sender` that causes RPC functions to return a [Sender](https://github.com/facebookexperimental/libunifex/blob/main/doc/concepts.md#sender-concept).\n\nIf you are interested in learning more about the implementation details of this library then check out [this blog article](https://medium.com/3yourmind/c-20-coroutines-for-asynchronous-grpc-services-5b3dab1d1d61).\n\nExamples of entire projects can be found in another [repository](https://github.com/Tradias/example-vcpkg-grpc).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftradias%2Fasio-grpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftradias%2Fasio-grpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftradias%2Fasio-grpc/lists"}