12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #pragma once
- #include "grpc_server.h"
- #include <util/generic/vector.h>
- #include <util/generic/string.h>
- #include <util/system/yassert.h>
- #include <util/generic/set.h>
- #include <grpc++/server.h>
- #include <grpc++/server_context.h>
- #include <chrono>
- namespace NGrpc {
- template<typename TService>
- class TBaseAsyncContext: public ICancelableContext {
- public:
- TBaseAsyncContext(typename TService::TCurrentGRpcService::AsyncService* service, grpc::ServerCompletionQueue* cq)
- : Service(service)
- , CQ(cq)
- {
- }
- TString GetPeerName() const {
- return TString(Context.peer());
- }
- TInstant Deadline() const {
-
-
-
-
-
-
-
-
- std::chrono::system_clock::time_point t = Context.deadline();
- if (t == std::chrono::system_clock::time_point::max()) {
- return TInstant::Max();
- }
- auto us = std::chrono::time_point_cast<std::chrono::microseconds>(t);
- return TInstant::MicroSeconds(us.time_since_epoch().count());
- }
- TSet<TStringBuf> GetPeerMetaKeys() const {
- TSet<TStringBuf> keys;
- for (const auto& [key, _]: Context.client_metadata()) {
- keys.emplace(key.data(), key.size());
- }
- return keys;
- }
- TVector<TStringBuf> GetPeerMetaValues(TStringBuf key) const {
- const auto& clientMetadata = Context.client_metadata();
- const auto range = clientMetadata.equal_range(grpc::string_ref{key.data(), key.size()});
- if (range.first == range.second) {
- return {};
- }
- TVector<TStringBuf> values;
- values.reserve(std::distance(range.first, range.second));
- for (auto it = range.first; it != range.second; ++it) {
- values.emplace_back(it->second.data(), it->second.size());
- }
- return values;
- }
- grpc_compression_level GetCompressionLevel() const {
- return Context.compression_level();
- }
- void Shutdown() override {
-
- if (Context.c_call())
- Context.TryCancel();
- }
- protected:
-
-
- typename TService::TCurrentGRpcService::AsyncService* const Service;
-
- grpc::ServerCompletionQueue* const CQ;
-
-
-
- grpc::ServerContext Context;
- };
- }
|