/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #if FOLLY_HAS_COROUTINES namespace apache::thrift { template class ServiceInterceptor : public ServiceInterceptorBase { private: template static T* getValueAsType( apache::thrift::util::TypeErasedValue& storage) { return storage.has_value() ? std::addressof(storage.template value_unchecked()) : nullptr; } public: virtual folly::coro::Task> onRequest( ConnectionState*, RequestInfo) { co_return std::nullopt; } virtual folly::coro::Task onResponse( RequestState*, ConnectionState*, ResponseInfo) { co_return; } virtual std::optional onConnection(ConnectionInfo) noexcept { return std::nullopt; } virtual void onConnectionClosed(ConnectionState*, ConnectionInfo) noexcept {} private: void internal_onConnection(ConnectionInfo connectionInfo) noexcept final { auto* storage = connectionInfo.storage; if (auto value = onConnection(std::move(connectionInfo))) { storage->emplace(std::move(*value)); } } void internal_onConnectionClosed( ConnectionInfo connectionInfo) noexcept final { auto* connectionState = getValueAsType(*connectionInfo.storage); onConnectionClosed(connectionState, std::move(connectionInfo)); } folly::coro::Task internal_onRequest( ConnectionInfo connectionInfo, RequestInfo requestInfo) final { auto* connectionState = getValueAsType(*connectionInfo.storage); if (auto value = co_await onRequest(connectionState, std::move(requestInfo))) { requestInfo.storage->emplace(std::move(*value)); } } folly::coro::Task internal_onResponse( ConnectionInfo connectionInfo, ResponseInfo responseInfo) final { auto* requestState = getValueAsType(*responseInfo.storage); auto* connectionState = getValueAsType(*connectionInfo.storage); co_await onResponse(requestState, connectionState, std::move(responseInfo)); } }; } // namespace apache::thrift #endif // FOLLY_HAS_COROUTINES