grpc 1.73.0 → 1.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (786) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +116 -53
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +18 -6
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/client_call.cc +4 -4
  11. data/src/core/call/filter_fusion.h +1230 -0
  12. data/src/core/call/interception_chain.h +7 -11
  13. data/src/core/call/metadata.cc +22 -0
  14. data/src/core/call/metadata.h +24 -2
  15. data/src/core/channelz/channel_trace.cc +213 -115
  16. data/src/core/channelz/channel_trace.h +380 -86
  17. data/src/core/channelz/channelz.cc +274 -192
  18. data/src/core/channelz/channelz.h +224 -72
  19. data/src/core/channelz/channelz_registry.cc +2 -163
  20. data/src/core/channelz/channelz_registry.h +37 -6
  21. data/src/core/channelz/property_list.cc +353 -0
  22. data/src/core/channelz/property_list.h +204 -0
  23. data/src/core/channelz/v2tov1/convert.cc +683 -0
  24. data/src/core/channelz/v2tov1/convert.h +58 -0
  25. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  26. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  27. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  28. data/src/core/channelz/v2tov1/property_list.h +52 -0
  29. data/src/core/channelz/ztrace_collector.h +3 -2
  30. data/src/core/client_channel/backup_poller.cc +17 -2
  31. data/src/core/client_channel/client_channel.cc +17 -28
  32. data/src/core/client_channel/client_channel_filter.cc +24 -33
  33. data/src/core/client_channel/client_channel_filter.h +2 -2
  34. data/src/core/client_channel/client_channel_internal.h +2 -1
  35. data/src/core/client_channel/config_selector.h +8 -2
  36. data/src/core/client_channel/dynamic_filters.cc +5 -6
  37. data/src/core/client_channel/dynamic_filters.h +1 -1
  38. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  39. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  40. data/src/core/client_channel/retry_filter.cc +21 -27
  41. data/src/core/client_channel/retry_filter.h +10 -7
  42. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  43. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  44. data/src/core/client_channel/retry_interceptor.cc +30 -44
  45. data/src/core/client_channel/retry_interceptor.h +18 -17
  46. data/src/core/client_channel/retry_throttle.cc +46 -61
  47. data/src/core/client_channel/retry_throttle.h +17 -39
  48. data/src/core/client_channel/subchannel.cc +57 -25
  49. data/src/core/client_channel/subchannel.h +10 -0
  50. data/src/core/config/config_vars.cc +2 -0
  51. data/src/core/config/core_configuration.cc +4 -1
  52. data/src/core/config/core_configuration.h +23 -0
  53. data/src/core/credentials/call/call_creds_registry.h +125 -0
  54. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  55. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  56. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  57. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  58. data/src/core/credentials/call/jwt_util.cc +70 -0
  59. data/src/core/credentials/call/jwt_util.h +32 -0
  60. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  61. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  62. data/src/core/credentials/transport/channel_creds_registry_init.cc +4 -2
  63. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  64. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -2
  65. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  66. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  67. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  68. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  69. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  70. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  71. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  72. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  73. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  74. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  75. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  76. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  77. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  78. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  79. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  80. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  81. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  82. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  83. data/src/core/ext/filters/http/client_authority_filter.cc +3 -6
  84. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  85. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  86. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  87. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  88. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  89. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  90. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  91. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  92. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  93. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +165 -117
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  95. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  96. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  97. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  98. data/src/core/ext/transport/chttp2/transport/flow_control.h +23 -17
  99. data/src/core/ext/transport/chttp2/transport/frame.cc +99 -6
  100. data/src/core/ext/transport/chttp2/transport/frame.h +40 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  104. data/src/core/ext/transport/chttp2/transport/header_assembler.h +290 -0
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  108. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  109. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1233 -0
  110. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +712 -0
  111. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  112. data/src/core/ext/transport/chttp2/transport/http2_settings.h +65 -51
  113. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  114. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  115. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  116. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  118. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +121 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.h +76 -0
  120. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  121. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  122. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  123. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  124. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  125. data/src/core/ext/transport/chttp2/transport/parsing.cc +4 -5
  126. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +152 -0
  128. data/src/core/ext/transport/chttp2/transport/ping_promise.h +197 -0
  129. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  130. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  131. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  132. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  133. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  134. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  135. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +41 -13
  137. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  138. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  143. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  144. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  145. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  146. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +1072 -0
  147. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +230 -0
  148. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  149. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  150. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  151. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  152. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  153. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +133 -0
  154. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  155. data/src/core/filter/auth/auth_filters.h +2 -27
  156. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  157. data/src/core/filter/filter_args.h +9 -23
  158. data/src/core/filter/fused_filters.cc +154 -0
  159. data/src/core/handshaker/handshaker.cc +23 -14
  160. data/src/core/handshaker/handshaker.h +3 -0
  161. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  162. data/src/core/handshaker/security/legacy_secure_endpoint.cc +7 -6
  163. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  164. data/src/core/handshaker/security/secure_endpoint.cc +98 -38
  165. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  166. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  167. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  168. data/src/core/lib/channel/channel_args.cc +15 -0
  169. data/src/core/lib/channel/channel_args.h +3 -0
  170. data/src/core/lib/channel/channel_stack.cc +22 -23
  171. data/src/core/lib/channel/channel_stack.h +9 -7
  172. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  173. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  174. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  175. data/src/core/lib/channel/promise_based_filter.h +11 -10
  176. data/src/core/lib/debug/trace_impl.h +0 -1
  177. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  178. data/src/core/lib/event_engine/ares_resolver.h +51 -3
  179. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +12 -6
  180. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -4
  181. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  182. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  183. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  184. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +14 -6
  185. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  186. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  187. data/src/core/lib/event_engine/event_engine.cc +7 -0
  188. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  189. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  190. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +139 -169
  191. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +17 -19
  192. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +90 -131
  193. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +13 -13
  194. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -23
  195. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -23
  196. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  197. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  198. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  199. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +30 -19
  200. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  201. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  202. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  203. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  204. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +147 -94
  205. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  206. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +435 -229
  207. data/src/core/lib/event_engine/posix_engine/posix_engine.h +78 -50
  208. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +46 -38
  209. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  210. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  211. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  212. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  213. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  214. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  215. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  216. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  217. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  218. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +11 -171
  219. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  220. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  221. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  222. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  223. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  224. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  225. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  226. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  227. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  228. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  229. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  230. data/src/core/lib/event_engine/shim.cc +9 -0
  231. data/src/core/lib/event_engine/shim.h +3 -0
  232. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  233. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  234. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  235. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  236. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +6 -1
  237. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  238. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  239. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  240. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  241. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  242. data/src/core/lib/experiments/experiments.cc +165 -99
  243. data/src/core/lib/experiments/experiments.h +65 -52
  244. data/src/core/lib/iomgr/combiner.cc +1 -1
  245. data/src/core/lib/iomgr/endpoint.cc +4 -3
  246. data/src/core/lib/iomgr/endpoint.h +7 -4
  247. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  248. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  249. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  250. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  251. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  252. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  253. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  254. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  255. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  256. data/src/core/lib/iomgr/tcp_posix.cc +15 -9
  257. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  258. data/src/core/lib/promise/activity.h +3 -2
  259. data/src/core/lib/promise/arena_promise.h +23 -7
  260. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  261. data/src/core/lib/promise/detail/promise_like.h +118 -11
  262. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  263. data/src/core/lib/promise/detail/seq_state.h +687 -548
  264. data/src/core/lib/promise/if.h +20 -0
  265. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  266. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  267. data/src/core/lib/promise/loop.h +65 -3
  268. data/src/core/lib/promise/map.h +24 -0
  269. data/src/core/lib/promise/match_promise.h +103 -0
  270. data/src/core/lib/promise/mpsc.cc +425 -0
  271. data/src/core/lib/promise/mpsc.h +490 -0
  272. data/src/core/lib/promise/party.cc +55 -6
  273. data/src/core/lib/promise/party.h +68 -3
  274. data/src/core/lib/promise/poll.h +10 -0
  275. data/src/core/lib/promise/race.h +31 -0
  276. data/src/core/lib/promise/seq.h +4 -1
  277. data/src/core/lib/promise/status_flag.h +7 -0
  278. data/src/core/lib/promise/try_seq.h +4 -1
  279. data/src/core/lib/promise/wait_set.cc +28 -0
  280. data/src/core/lib/promise/wait_set.h +86 -0
  281. data/src/core/lib/resource_quota/arena.h +19 -0
  282. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  283. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  284. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  285. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  286. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  287. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  288. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  289. data/src/core/lib/slice/slice.h +5 -0
  290. data/src/core/lib/surface/call.cc +5 -5
  291. data/src/core/lib/surface/call.h +6 -5
  292. data/src/core/lib/surface/channel_create.cc +88 -13
  293. data/src/core/lib/surface/channel_create.h +4 -0
  294. data/src/core/lib/surface/channel_init.cc +164 -47
  295. data/src/core/lib/surface/channel_init.h +64 -1
  296. data/src/core/lib/surface/completion_queue.cc +2 -4
  297. data/src/core/lib/surface/filter_stack_call.cc +19 -10
  298. data/src/core/lib/surface/init.cc +6 -15
  299. data/src/core/lib/surface/legacy_channel.cc +3 -5
  300. data/src/core/lib/surface/legacy_channel.h +3 -1
  301. data/src/core/lib/surface/version.cc +2 -2
  302. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  303. data/src/core/lib/transport/promise_endpoint.h +307 -0
  304. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  305. data/src/core/load_balancing/delegating_helper.h +2 -3
  306. data/src/core/load_balancing/endpoint_list.cc +29 -2
  307. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  308. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  309. data/src/core/load_balancing/health_check_client.cc +1 -5
  310. data/src/core/load_balancing/lb_policy.h +1 -3
  311. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  312. data/src/core/load_balancing/pick_first/pick_first.cc +15 -5
  313. data/src/core/load_balancing/xds/cds.cc +10 -1
  314. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  315. data/src/core/net/socket_mutator.cc +19 -0
  316. data/src/core/net/socket_mutator.h +25 -0
  317. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  318. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  319. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  320. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  321. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  322. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  323. data/src/core/resolver/xds/xds_config.cc +6 -3
  324. data/src/core/resolver/xds/xds_config.h +9 -4
  325. data/src/core/resolver/xds/xds_dependency_manager.cc +22 -7
  326. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  327. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  328. data/src/core/server/server.cc +84 -13
  329. data/src/core/server/server.h +21 -2
  330. data/src/core/server/server_call_tracer_filter.cc +0 -66
  331. data/src/core/server/server_call_tracer_filter.h +64 -0
  332. data/src/core/server/server_config_selector_filter.cc +1 -1
  333. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  334. data/src/core/service_config/service_config.h +1 -1
  335. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  336. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  337. data/src/core/service_config/service_config_impl.h +1 -1
  338. data/src/core/telemetry/call_tracer.cc +20 -14
  339. data/src/core/telemetry/call_tracer.h +22 -17
  340. data/src/core/telemetry/context_list_entry.cc +38 -0
  341. data/src/core/telemetry/context_list_entry.h +42 -12
  342. data/src/core/telemetry/metrics.h +8 -8
  343. data/src/core/telemetry/stats_data.cc +369 -343
  344. data/src/core/telemetry/stats_data.h +341 -244
  345. data/src/core/telemetry/tcp_tracer.h +1 -1
  346. data/src/core/transport/auth_context.cc +20 -0
  347. data/src/core/transport/auth_context.h +4 -0
  348. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  349. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  350. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  351. data/src/core/tsi/fake_transport_security.cc +17 -0
  352. data/src/core/tsi/ssl_transport_security.cc +205 -32
  353. data/src/core/tsi/ssl_transport_security.h +19 -10
  354. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  355. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  356. data/src/core/tsi/transport_security_grpc.cc +8 -0
  357. data/src/core/tsi/transport_security_grpc.h +15 -0
  358. data/src/core/util/backoff.cc +1 -5
  359. data/src/core/util/backoff.h +1 -0
  360. data/src/core/util/down_cast.h +1 -1
  361. data/src/core/util/function_signature.h +15 -1
  362. data/src/core/util/http_client/httpcli.cc +12 -5
  363. data/src/core/util/http_client/httpcli.h +4 -1
  364. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  365. data/src/core/util/latent_see.cc +178 -146
  366. data/src/core/util/latent_see.h +249 -189
  367. data/src/core/util/log.cc +4 -0
  368. data/src/core/util/memory_usage.h +268 -0
  369. data/src/core/util/per_cpu.cc +2 -0
  370. data/src/core/util/per_cpu.h +7 -0
  371. data/src/core/util/shared_bit_gen.h +20 -0
  372. data/src/core/util/single_set_ptr.h +7 -4
  373. data/src/core/util/upb_utils.h +42 -0
  374. data/src/core/util/uri.cc +3 -2
  375. data/src/core/util/useful.h +144 -2
  376. data/src/core/util/wait_for_single_owner.cc +31 -0
  377. data/src/core/util/wait_for_single_owner.h +24 -0
  378. data/src/core/util/windows/directory_reader.cc +1 -0
  379. data/src/core/util/windows/thd.cc +1 -3
  380. data/src/core/util/work_serializer.cc +1 -1
  381. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  382. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  383. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  384. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  385. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  386. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  387. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  388. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  389. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  390. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  391. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  392. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  393. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  394. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  395. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  396. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  397. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  398. data/src/core/xds/xds_client/xds_client.cc +26 -5
  399. data/src/ruby/ext/grpc/extconf.rb +2 -0
  400. data/src/ruby/ext/grpc/rb_call.c +1 -8
  401. data/src/ruby/ext/grpc/rb_channel.c +70 -557
  402. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  403. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  404. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  405. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  406. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  407. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  408. data/src/ruby/ext/grpc/rb_server.c +31 -50
  409. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  410. data/src/ruby/lib/grpc/version.rb +1 -1
  411. data/src/ruby/spec/core_spec.rb +22 -0
  412. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  413. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  414. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  415. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  416. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  417. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  418. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  419. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  420. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  421. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  422. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  423. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  424. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  425. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  426. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  427. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  428. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  429. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  430. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  431. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  432. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  433. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  434. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  435. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  436. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  437. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  438. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  439. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  440. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  441. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  442. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  443. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  444. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  445. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  446. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  447. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  448. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  449. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  450. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  451. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  452. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  453. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  454. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  455. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  456. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  457. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  458. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  459. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  460. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  461. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  462. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  463. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  464. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  470. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  471. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  472. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  473. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  474. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  475. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  476. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  477. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  478. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  479. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  480. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  481. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  482. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  483. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  484. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  485. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  486. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  487. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  488. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  489. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  490. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  491. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  492. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  493. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  494. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  495. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  496. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  497. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  498. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  499. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  500. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  501. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  502. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  503. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  504. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  505. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  506. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  507. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  508. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  509. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  510. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  511. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  512. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  513. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  514. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  515. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  516. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  517. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  518. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  519. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  520. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  521. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  522. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  523. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  524. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  525. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  526. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  527. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  528. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  529. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  530. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  531. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  532. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  533. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  534. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  535. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  536. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  537. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  538. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  539. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  540. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  541. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  542. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  543. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  544. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  545. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  546. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  547. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  548. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  549. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  550. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  551. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  552. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  553. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  554. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  555. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  556. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  557. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  558. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  559. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  560. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  561. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  562. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  563. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  564. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  565. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  566. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  567. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  568. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  569. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  570. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  571. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  572. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  573. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  574. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  575. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  576. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  577. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  578. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  579. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  580. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  581. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  582. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  583. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  584. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  585. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  586. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  587. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  588. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  589. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  590. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  591. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  592. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  593. data/third_party/cares/cares/include/ares.h +925 -460
  594. data/third_party/cares/cares/include/ares_dns.h +86 -71
  595. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  596. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  597. data/third_party/cares/cares/include/ares_version.h +37 -14
  598. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  599. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  600. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  601. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  602. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  603. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  604. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  605. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  606. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  607. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  608. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  609. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  610. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  611. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  612. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  613. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  614. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  615. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  616. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  617. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  618. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  619. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  620. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  621. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  622. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  623. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  624. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  625. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  626. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  627. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  628. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  629. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  630. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  631. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  632. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  633. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  634. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  635. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  636. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  637. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  638. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  639. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  640. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  641. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  642. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  643. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  644. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  645. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  646. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  647. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  648. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  649. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  650. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  651. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  652. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  653. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  654. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  655. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  656. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  657. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  658. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  659. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  660. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  661. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  662. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  663. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  664. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  665. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  666. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  667. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  668. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  669. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  670. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  671. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  672. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  673. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  674. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  675. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  676. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  677. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  678. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  679. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  680. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  681. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  682. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  683. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  684. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  685. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  686. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  687. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  688. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  689. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  690. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  691. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  692. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  693. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  694. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  695. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  696. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  697. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  698. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  699. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  700. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  701. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  702. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  703. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  704. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  705. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  706. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  707. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  708. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  709. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  710. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  711. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  712. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  713. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  714. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  715. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  716. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  717. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  718. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  719. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  720. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  721. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  722. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  723. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  724. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  725. metadata +192 -68
  726. data/src/core/lib/event_engine/forkable.cc +0 -105
  727. data/src/core/lib/event_engine/forkable.h +0 -67
  728. data/src/core/lib/iomgr/python_util.h +0 -46
  729. data/src/core/util/ring_buffer.h +0 -122
  730. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  731. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  732. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  733. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  734. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  735. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  736. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  737. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  738. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  739. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
  740. data/third_party/cares/cares/include/ares_rules.h +0 -125
  741. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  742. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  743. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  744. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  745. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  746. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  747. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  748. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  749. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  750. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  751. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  752. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  753. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  754. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  755. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  756. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  757. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  758. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  759. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  760. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  761. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  762. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  763. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  764. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  765. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  766. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  767. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  768. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  769. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  770. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  771. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  772. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  773. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  774. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  775. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  776. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  777. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  778. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  779. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  780. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  781. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  782. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  783. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  784. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  785. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  786. data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -0,0 +1,1230 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_CALL_FILTER_FUSION_H
16
+ #define GRPC_SRC_CORE_CALL_FILTER_FUSION_H
17
+ #include <grpc/impl/grpc_types.h>
18
+
19
+ #include <cstddef>
20
+ #include <memory>
21
+ #include <string>
22
+ #include <tuple>
23
+ #include <type_traits>
24
+ #include <utility>
25
+
26
+ #include "absl/log/check.h"
27
+ #include "absl/log/log.h"
28
+ #include "absl/memory/memory.h"
29
+ #include "absl/status/status.h"
30
+ #include "absl/strings/str_join.h"
31
+ #include "src/core/call/call_filters.h"
32
+ #include "src/core/call/metadata.h"
33
+ #include "src/core/lib/channel/channel_args.h"
34
+ #include "src/core/lib/channel/promise_based_filter.h"
35
+ #include "src/core/lib/promise/promise.h"
36
+ #include "src/core/lib/transport/call_final_info.h"
37
+ #include "src/core/lib/transport/transport.h"
38
+ #include "src/core/util/manual_constructor.h"
39
+ #include "src/core/util/status_helper.h"
40
+ #include "src/core/util/type_list.h"
41
+
42
+ struct grpc_transport_op;
43
+
44
+ namespace grpc_core {
45
+ namespace filters_detail {
46
+
47
+ template <typename... Ts>
48
+ constexpr bool AllNoInterceptor =
49
+ (std::is_same_v<Ts, const NoInterceptor*> && ...);
50
+
51
+ enum class MethodVariant {
52
+ kNoInterceptor,
53
+ kSimple,
54
+ kChannelAccess,
55
+ };
56
+
57
+ template <typename... Ts>
58
+ constexpr MethodVariant MethodVariantForFilters() {
59
+ if constexpr (AllNoInterceptor<Ts...>) {
60
+ return MethodVariant::kNoInterceptor;
61
+ } else if constexpr (!AnyMethodHasChannelAccess<Ts...>) {
62
+ return MethodVariant::kSimple;
63
+ } else {
64
+ return MethodVariant::kChannelAccess;
65
+ }
66
+ }
67
+
68
+ template <typename T>
69
+ using Hdl = Arena::PoolPtr<T>;
70
+
71
+ template <typename T, typename A>
72
+ constexpr bool IsSameExcludingCVRef =
73
+ std::is_same<promise_detail::RemoveCVRef<A>, T>::value;
74
+
75
+ template <typename T, typename A>
76
+ using EnableIfSameExcludingCVRef =
77
+ std::enable_if_t<std::is_same<promise_detail::RemoveCVRef<A>, T>::value,
78
+ void>;
79
+
80
+ template <typename T, typename MethodType, MethodType method,
81
+ typename Ignored = void>
82
+ class AdaptMethod;
83
+
84
+ template <typename T, const NoInterceptor* method>
85
+ class AdaptMethod<T, const NoInterceptor*, method> {
86
+ public:
87
+ explicit AdaptMethod(void* /*call*/, void* /*filter*/ = nullptr) {}
88
+ auto operator()(Hdl<T> x) {
89
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
90
+ }
91
+ void operator()(T* /*x*/) {}
92
+ };
93
+
94
+ // Overrides for Filter methods with void Return types.
95
+ template <typename T, typename A, typename Call, void (Call::*method)(A)>
96
+ class AdaptMethod<T, void (Call::*)(A), method,
97
+ EnableIfSameExcludingCVRef<T, A>> {
98
+ public:
99
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
100
+
101
+ auto operator()(Hdl<T> x) {
102
+ (call_->*method)(*x);
103
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
104
+ }
105
+
106
+ private:
107
+ Call* call_;
108
+ };
109
+
110
+ template <typename T, typename Call, void (Call::*method)()>
111
+ class AdaptMethod<T, void (Call::*)(), method> {
112
+ public:
113
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
114
+ auto operator()(Hdl<T> x) {
115
+ (call_->*method)();
116
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
117
+ }
118
+
119
+ private:
120
+ Call* call_;
121
+ };
122
+
123
+ template <typename T, typename A, typename Call, typename Derived,
124
+ void (Call::*method)(A, Derived*)>
125
+ class AdaptMethod<T, void (Call::*)(A, Derived*), method,
126
+ EnableIfSameExcludingCVRef<T, A>> {
127
+ public:
128
+ explicit AdaptMethod(Call* call, Derived* filter)
129
+ : call_(call), filter_(filter) {}
130
+ auto operator()(Hdl<T> x) {
131
+ (call_->*method)(*x, filter_);
132
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
133
+ }
134
+
135
+ private:
136
+ Call* call_;
137
+ Derived* filter_;
138
+ };
139
+
140
+ // primary template handles types that have no nested ::Call member:
141
+ template <class, class = void>
142
+ constexpr const bool kHasCallMember = false;
143
+
144
+ // specialization recognizes types that have a nested ::Call member:
145
+ template <class T>
146
+ constexpr const bool kHasCallMember<T, std::void_t<typename T::Call>> = true;
147
+
148
+ // Override for filter method types that take a pointer to the filter along
149
+ // with another arbitrary pointer type. Expected to be used to handle
150
+ // OnFinalize methods.
151
+ template <typename A, typename Call, typename Derived,
152
+ void (Call::*method)(const A*, Derived*)>
153
+ class AdaptMethod<
154
+ A, void (Call::*)(const A*, Derived*), method,
155
+ std::enable_if_t<std::is_same<typename Derived::Call, Call>::value, void>> {
156
+ public:
157
+ explicit AdaptMethod(Call* call, Derived* filter)
158
+ : call_(call), filter_(filter) {}
159
+ void operator()(A* arg) { (call_->*method)(arg, filter_); }
160
+
161
+ private:
162
+ Call* call_;
163
+ Derived* filter_;
164
+ };
165
+
166
+ // Same as above with the const qualifiers removed.
167
+ template <typename A, typename Call, typename Derived,
168
+ void (Call::*method)(A*, Derived*)>
169
+ class AdaptMethod<
170
+ A, void (Call::*)(A*, Derived*), method,
171
+ std::enable_if_t<std::is_same<typename Derived::Call, Call>::value, void>> {
172
+ public:
173
+ explicit AdaptMethod(Call* call, Derived* filter)
174
+ : call_(call), filter_(filter) {}
175
+ void operator()(A* arg) { (call_->*method)(arg, filter_); }
176
+
177
+ private:
178
+ Call* call_;
179
+ Derived* filter_;
180
+ };
181
+
182
+ // Override for filter method types that another arbitrary pointer type.
183
+ // Expected to be used to handle OnFinalize methods.
184
+ template <typename A, typename Call, void (Call::*method)(const A*)>
185
+ class AdaptMethod<A, void (Call::*)(const A*), method,
186
+ std::enable_if_t<!kHasCallMember<A>, void>> {
187
+ public:
188
+ explicit AdaptMethod(Call* call, void* /*filter*/) : call_(call) {}
189
+ void operator()(A* arg) { (call_->*method)(arg); }
190
+
191
+ private:
192
+ Call* call_;
193
+ };
194
+
195
+ // Same as above with the const qualifiers removed.
196
+ template <typename A, typename Call, void (Call::*method)(A*)>
197
+ class AdaptMethod<A, void (Call::*)(A*), method,
198
+ std::enable_if_t<!kHasCallMember<A>, void>> {
199
+ public:
200
+ explicit AdaptMethod(Call* call, void* /*filter*/) : call_(call) {}
201
+ void operator()(A* arg) { (call_->*method)(arg); }
202
+
203
+ private:
204
+ Call* call_;
205
+ };
206
+
207
+ template <typename T, typename AnyType = void>
208
+ struct TakeValueExists {
209
+ static constexpr bool value = false;
210
+ };
211
+
212
+ template <typename T>
213
+ struct TakeValueExists<T,
214
+ absl::void_t<decltype(TakeValue(std::declval<T>()))>> {
215
+ static constexpr bool value = true;
216
+ };
217
+
218
+ template <typename T, typename AnyType = void>
219
+ struct StatusType {
220
+ static constexpr bool value = false;
221
+ };
222
+
223
+ template <typename T>
224
+ struct StatusType<
225
+ T, absl::enable_if_t<
226
+ std::is_same<decltype(IsStatusOk(std::declval<T>())), bool>::value &&
227
+ !std::is_same<T, ServerMetadataHandle>::value &&
228
+ !TakeValueExists<T>::value,
229
+ void>> {
230
+ static constexpr bool value = true;
231
+ };
232
+
233
+ template <typename T, typename = void>
234
+ struct HasStatusMethod {
235
+ static constexpr bool value = false;
236
+ };
237
+
238
+ template <typename T>
239
+ struct HasStatusMethod<
240
+ T, std::enable_if_t<!std::is_void_v<decltype(std::declval<T>().status())>,
241
+ void>> {
242
+ static constexpr bool value = true;
243
+ };
244
+
245
+ template <typename T>
246
+ constexpr bool IsPromise = std::is_invocable_v<T>;
247
+
248
+ // For types T which are of the form StatusOr<U>. Type TakeValue on Type T
249
+ // must return a value of type U. Further type T must have a method called
250
+ // status() and must return a bool when IsStatusOk is called on an object of
251
+ // type T.
252
+ template <typename T, typename U, typename AnyType = void>
253
+ struct StatusOrType {
254
+ static constexpr bool value = false;
255
+ };
256
+ template <typename T, typename U>
257
+ struct StatusOrType<
258
+ T, U,
259
+ absl::enable_if_t<
260
+ std::is_same<decltype(IsStatusOk(std::declval<T>())), bool>::value &&
261
+ TakeValueExists<T>::value && HasStatusMethod<T>::value &&
262
+ std::is_same<decltype(TakeValue(std::declval<T>())), U>::value,
263
+ void>> {
264
+ static constexpr bool value = true;
265
+ };
266
+
267
+ // Overrides for Filter methods with a Return type supporting a bool ok()
268
+ // method without holding a value within e.g., for absl::Status or StatusFlag
269
+ // return types.
270
+ template <typename T, typename A, typename R, typename Call,
271
+ R (Call::*method)(A)>
272
+ class AdaptMethod<
273
+ T, R (Call::*)(A), method,
274
+ absl::enable_if_t<StatusType<R>::value && IsSameExcludingCVRef<T, A>,
275
+ void>> {
276
+ public:
277
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
278
+ auto operator()(Hdl<T> x) {
279
+ R result = (call_->*method)(*x);
280
+ if (IsStatusOk(result)) {
281
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
282
+ }
283
+ return Immediate(
284
+ ServerMetadataOrHandle<T>::Failure(ServerMetadataFromStatus(result)));
285
+ }
286
+
287
+ private:
288
+ Call* call_;
289
+ };
290
+
291
+ template <typename T, typename R, typename Call, R (Call::*method)()>
292
+ class AdaptMethod<T, R (Call::*)(), method,
293
+ absl::enable_if_t<StatusType<R>::value, void>> {
294
+ public:
295
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
296
+ auto operator()(Hdl<T> x) {
297
+ R result = (call_->*method)();
298
+ if (IsStatusOk(result)) {
299
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
300
+ };
301
+ return Immediate(
302
+ ServerMetadataOrHandle<T>::Failure(ServerMetadataFromStatus(result)));
303
+ }
304
+
305
+ private:
306
+ Call* call_;
307
+ };
308
+
309
+ template <typename T, typename A, typename R, typename Call, typename Derived,
310
+ R (Call::*method)(A, Derived*)>
311
+ class AdaptMethod<
312
+ T, R (Call::*)(A, Derived*), method,
313
+ absl::enable_if_t<StatusType<R>::value && IsSameExcludingCVRef<T, A>,
314
+ void>> {
315
+ public:
316
+ explicit AdaptMethod(Call* call, Derived* filter)
317
+ : call_(call), filter_(filter) {}
318
+ auto operator()(Hdl<T> x) {
319
+ R result = (call_->*method)(*x, filter_);
320
+ if (IsStatusOk(result)) {
321
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
322
+ }
323
+ return Immediate(
324
+ ServerMetadataOrHandle<T>::Failure(ServerMetadataFromStatus(result)));
325
+ }
326
+
327
+ private:
328
+ Call* call_;
329
+ Derived* filter_;
330
+ };
331
+
332
+ // Overrides for Filter methods with a Return type supporting a bool ok()
333
+ // method and holding a value within e.g., for absl::StatusOr<T> return types.
334
+ template <typename T, typename A, typename R, typename Call,
335
+ R (Call::*method)(A)>
336
+ class AdaptMethod<
337
+ T, R (Call::*)(A), method,
338
+ absl::enable_if_t<StatusOrType<R, T>::value && IsSameExcludingCVRef<T, A>,
339
+ void>> {
340
+ public:
341
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
342
+ auto operator()(Hdl<T> x) {
343
+ R result = (call_->*method)(*x);
344
+ if (IsStatusOk(result)) {
345
+ return Immediate(
346
+ ServerMetadataOrHandle<T>::Ok(TakeValue(std::move(result))));
347
+ }
348
+ return Immediate(ServerMetadataOrHandle<T>::Failure(
349
+ ServerMetadataFromStatus(std::move(result.status()))));
350
+ }
351
+
352
+ private:
353
+ Call* call_;
354
+ };
355
+
356
+ template <typename T, typename R, typename Call, R (Call::*method)()>
357
+ class AdaptMethod<T, R (Call::*)(), method,
358
+ absl::enable_if_t<StatusOrType<R, T>::value, void>> {
359
+ public:
360
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
361
+ auto operator()(Hdl<T> /*x*/) {
362
+ R result = (call_->*method)();
363
+ if (IsStatusOk(result)) {
364
+ return Immediate(
365
+ ServerMetadataOrHandle<T>::Ok(TakeValue(std::move(result))));
366
+ }
367
+ return Immediate(ServerMetadataOrHandle<T>::Failure(
368
+ ServerMetadataFromStatus(std::move(result.status()))));
369
+ }
370
+
371
+ private:
372
+ Call* call_;
373
+ };
374
+
375
+ template <typename T, typename A, typename R, typename Call, typename Derived,
376
+ R (Call::*method)(A, Derived*)>
377
+ class AdaptMethod<
378
+ T, R (Call::*)(A, Derived*), method,
379
+ absl::enable_if_t<StatusOrType<R, T>::value && IsSameExcludingCVRef<T, A>,
380
+ void>> {
381
+ public:
382
+ using UnwrappedType = decltype(TakeValue(std::declval<R>()));
383
+ static_assert(std::is_same<UnwrappedType, T>::value);
384
+ explicit AdaptMethod(Call* call, Derived* filter)
385
+ : call_(call), filter_(filter) {}
386
+ auto operator()(Hdl<T> x) {
387
+ R result = (call_->*method)(*x, filter_);
388
+ if (IsStatusOk(result)) {
389
+ return Immediate(
390
+ ServerMetadataOrHandle<T>::Ok(TakeValue(std::move(result))));
391
+ }
392
+ return Immediate(ServerMetadataOrHandle<T>::Failure(
393
+ ServerMetadataFromStatus(std::move(result.status()))));
394
+ }
395
+
396
+ private:
397
+ Call* call_;
398
+ Derived* filter_;
399
+ };
400
+
401
+ // Overrides for filter methods which take a Hdl<T> type or void as input and
402
+ // return a StatusOr<Hdl<T>> type as output
403
+ template <typename T, typename R, typename Call, R (Call::*method)(Hdl<T>)>
404
+ class AdaptMethod<T, R (Call::*)(Hdl<T>), method,
405
+ absl::enable_if_t<StatusOrType<R, Hdl<T>>::value, void>> {
406
+ public:
407
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
408
+ auto operator()(Hdl<T> x) {
409
+ R result = (call_->*method)(std::move(x));
410
+ if (IsStatusOk(result)) {
411
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(*result)));
412
+ }
413
+
414
+ return Immediate(ServerMetadataOrHandle<T>::Failure(
415
+ ServerMetadataFromStatus(result.status())));
416
+ }
417
+
418
+ private:
419
+ Call* call_;
420
+ };
421
+
422
+ template <typename T, typename R, typename Call, R (Call::*method)()>
423
+ class AdaptMethod<T, R (Call::*)(), method,
424
+ absl::enable_if_t<StatusOrType<R, Hdl<T>>::value, void>> {
425
+ public:
426
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
427
+ auto operator()(Hdl<T> /*x*/) {
428
+ R result = (call_->*method)();
429
+ if (IsStatusOk(result)) {
430
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(*result)));
431
+ }
432
+
433
+ return Immediate(ServerMetadataOrHandle<T>::Failure(
434
+ ServerMetadataFromStatus(result.status())));
435
+ }
436
+
437
+ private:
438
+ Call* call_;
439
+ };
440
+
441
+ template <typename T, typename R, typename Call, typename Derived,
442
+ R (Call::*method)(Hdl<T>, Derived*)>
443
+ class AdaptMethod<T, R (Call::*)(Hdl<T>, Derived*), method,
444
+ absl::enable_if_t<StatusOrType<R, Hdl<T>>::value, void>> {
445
+ public:
446
+ explicit AdaptMethod(Call* call, Derived* filter)
447
+ : call_(call), filter_(filter) {}
448
+ auto operator()(Hdl<T> x) {
449
+ R result = (call_->*method)(std::move(x), filter_);
450
+ if (IsStatusOk(result)) {
451
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(*result)));
452
+ }
453
+
454
+ return Immediate(ServerMetadataOrHandle<T>::Failure(
455
+ ServerMetadataFromStatus(result.status())));
456
+ }
457
+
458
+ private:
459
+ Call* call_;
460
+ Derived* filter_;
461
+ };
462
+
463
+ // For methods which return a promise where the result of the promise
464
+ template <typename T, typename R, typename Call, typename Derived,
465
+ R (Call::*method)(Hdl<T>, Derived*)>
466
+ class AdaptMethod<
467
+ T, R (Call::*)(Hdl<T>, Derived*), method,
468
+ std::enable_if_t<IsPromise<R> && std::is_same_v<PromiseResult<R>,
469
+ absl::StatusOr<Hdl<T>>>,
470
+ void>> {
471
+ public:
472
+ explicit AdaptMethod(Call* call, Derived* filter)
473
+ : call_(call), filter_(filter) {}
474
+ auto operator()(Hdl<T> x) {
475
+ return Map((call_->*method)(std::move(x), filter_),
476
+ [](absl::StatusOr<Hdl<T>> result) {
477
+ if (result.ok()) {
478
+ return ServerMetadataOrHandle<T>::Ok(std::move(*result));
479
+ }
480
+ return ServerMetadataOrHandle<T>::Failure(
481
+ ServerMetadataFromStatus(result.status()));
482
+ });
483
+ }
484
+
485
+ private:
486
+ Call* call_;
487
+ Derived* filter_;
488
+ };
489
+
490
+ template <typename T, typename R, typename Call, typename Derived,
491
+ R (Call::*method)(T&, Derived*)>
492
+ class AdaptMethod<
493
+ T, R (Call::*)(T&, Derived*), method,
494
+ std::enable_if_t<
495
+ IsPromise<R> && std::is_same_v<absl::Status, PromiseResult<R>>, void>> {
496
+ public:
497
+ explicit AdaptMethod(Call* call, Derived* filter)
498
+ : call_(call), filter_(filter) {}
499
+ auto operator()(Hdl<T> x) {
500
+ return Map((call_->*method)(*x, filter_),
501
+ [hdl = std::move(x)](absl::Status status) mutable {
502
+ if (status.ok()) {
503
+ return ServerMetadataOrHandle<T>::Ok(std::move(hdl));
504
+ }
505
+ return ServerMetadataOrHandle<T>::Failure(
506
+ ServerMetadataFromStatus(status));
507
+ });
508
+ }
509
+
510
+ private:
511
+ Call* call_;
512
+ Derived* filter_;
513
+ };
514
+
515
+ template <typename T, typename Call, typename Derived,
516
+ Hdl<T> (Call::*method)(Hdl<T>, Derived*)>
517
+ class AdaptMethod<T, Hdl<T> (Call::*)(Hdl<T>, Derived*), method> {
518
+ public:
519
+ explicit AdaptMethod(Call* call, Derived* filter)
520
+ : call_(call), filter_(filter) {}
521
+ auto operator()(Hdl<T> x) {
522
+ Hdl<T> result = (call_->*method)(std::move(x), filter_);
523
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(result)));
524
+ }
525
+
526
+ private:
527
+ Call* call_;
528
+ Derived* filter_;
529
+ };
530
+
531
+ // Overrides for filter methods which return a ServerMetadataHandle type as
532
+ // output.
533
+ template <typename T, typename A, typename Call,
534
+ ServerMetadataHandle (Call::*method)(A)>
535
+ class AdaptMethod<T, ServerMetadataHandle (Call::*)(A), method,
536
+ EnableIfSameExcludingCVRef<T, A>> {
537
+ public:
538
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
539
+ auto operator()(Hdl<T> x) {
540
+ ServerMetadataHandle handle = (call_->*method)(*x);
541
+ if (handle == nullptr) {
542
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
543
+ }
544
+
545
+ return Immediate(ServerMetadataOrHandle<T>::Failure(std::move(handle)));
546
+ }
547
+
548
+ private:
549
+ Call* call_;
550
+ };
551
+
552
+ template <typename T, typename Call, ServerMetadataHandle (Call::*method)()>
553
+ class AdaptMethod<T, ServerMetadataHandle (Call::*)(), method> {
554
+ public:
555
+ explicit AdaptMethod(Call* call, void* /*filter*/ = nullptr) : call_(call) {}
556
+ auto operator()(Hdl<T> x) {
557
+ ServerMetadataHandle handle = (call_->*method)();
558
+ if (handle == nullptr) {
559
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
560
+ }
561
+
562
+ return Immediate(ServerMetadataOrHandle<T>::Failure(std::move(handle)));
563
+ }
564
+
565
+ private:
566
+ Call* call_;
567
+ };
568
+
569
+ template <typename T, typename A, typename Call, typename Derived,
570
+ ServerMetadataHandle (Call::*method)(A, Derived*)>
571
+ class AdaptMethod<T, ServerMetadataHandle (Call::*)(A, Derived*), method,
572
+ EnableIfSameExcludingCVRef<T, A>> {
573
+ public:
574
+ explicit AdaptMethod(Call* call, Derived* filter)
575
+ : call_(call), filter_(filter) {}
576
+ auto operator()(Hdl<T> x) {
577
+ ServerMetadataHandle handle = (call_->*method)(*x, filter_);
578
+ if (handle == nullptr) {
579
+ return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
580
+ }
581
+
582
+ return Immediate(ServerMetadataOrHandle<T>::Failure(std::move(handle)));
583
+ }
584
+
585
+ private:
586
+ Call* call_;
587
+ Derived* filter_;
588
+ };
589
+
590
+ template <typename T, typename MethodType, MethodType method,
591
+ typename Ignored = void>
592
+ class AdaptOnServerTrailingMetadataMethod;
593
+
594
+ template <typename T, const NoInterceptor* method>
595
+ class AdaptOnServerTrailingMetadataMethod<T, const NoInterceptor*, method> {
596
+ public:
597
+ explicit AdaptOnServerTrailingMetadataMethod(void* /*call*/,
598
+ void* /*filter*/ = nullptr) {}
599
+ auto operator()(T& /*x*/) {}
600
+ void operator()(T* /*x*/) {}
601
+ };
602
+
603
+ template <typename T, typename A, typename Call, typename Derived,
604
+ void (Call::*method)(A, Derived*)>
605
+ class AdaptOnServerTrailingMetadataMethod<
606
+ T, void (Call::*)(A, Derived*), method, EnableIfSameExcludingCVRef<T, A>> {
607
+ public:
608
+ explicit AdaptOnServerTrailingMetadataMethod(Call* call, Derived* filter)
609
+ : call_(call), filter_(filter) {}
610
+ void operator()(T& x) { (call_->*method)(x, filter_); }
611
+
612
+ private:
613
+ Call* call_;
614
+ Derived* filter_;
615
+ };
616
+
617
+ template <typename T, typename A, typename Call, typename Derived,
618
+ absl::Status (Call::*method)(A, Derived*)>
619
+ class AdaptOnServerTrailingMetadataMethod<
620
+ T, absl::Status (Call::*)(A, Derived*), method,
621
+ EnableIfSameExcludingCVRef<T, A>> {
622
+ public:
623
+ explicit AdaptOnServerTrailingMetadataMethod(Call* call, Derived* filter)
624
+ : call_(call), filter_(filter) {}
625
+ void operator()(T& x) {
626
+ absl::Status status = (call_->*method)(x, filter_);
627
+ if (!status.ok()) {
628
+ SetServerMetadataFromStatus(x, status);
629
+ }
630
+ }
631
+
632
+ private:
633
+ Call* call_;
634
+ Derived* filter_;
635
+ };
636
+
637
+ template <typename T, typename A, typename Call, void (Call::*method)(A)>
638
+ class AdaptOnServerTrailingMetadataMethod<T, void (Call::*)(A), method,
639
+ EnableIfSameExcludingCVRef<T, A>> {
640
+ public:
641
+ explicit AdaptOnServerTrailingMetadataMethod(Call* call, void* /*filter*/)
642
+ : call_(call) {}
643
+ void operator()(T& x) { (call_->*method)(x); }
644
+
645
+ private:
646
+ Call* call_;
647
+ };
648
+
649
+ template <typename T, typename A, typename Call,
650
+ absl::Status (Call::*method)(A)>
651
+ class AdaptOnServerTrailingMetadataMethod<T, absl::Status (Call::*)(A), method,
652
+ EnableIfSameExcludingCVRef<T, A>> {
653
+ public:
654
+ explicit AdaptOnServerTrailingMetadataMethod(Call* call, void* /*filter*/)
655
+ : call_(call) {}
656
+ void operator()(T& x) {
657
+ absl::Status status = (call_->*method)(x);
658
+ if (!status.ok()) {
659
+ SetServerMetadataFromStatus(x, status);
660
+ }
661
+ }
662
+
663
+ private:
664
+ Call* call_;
665
+ };
666
+
667
+ template <typename MethodType, MethodType method, typename Ignored = void>
668
+ class AdaptOnClientToServerHalfCloseMethod;
669
+
670
+ template <const NoInterceptor* method>
671
+ class AdaptOnClientToServerHalfCloseMethod<const NoInterceptor*, method> {
672
+ public:
673
+ explicit AdaptOnClientToServerHalfCloseMethod(void* /*call*/) {}
674
+ void operator()() {}
675
+ };
676
+
677
+ template <typename Call, void (Call::*method)()>
678
+ class AdaptOnClientToServerHalfCloseMethod<void (Call::*)(), method> {
679
+ public:
680
+ explicit AdaptOnClientToServerHalfCloseMethod(Call* call) : call_(call) {}
681
+ void operator()() { (call_->*method)(); }
682
+
683
+ private:
684
+ Call* call_;
685
+ };
686
+
687
+ template <auto... filter_methods>
688
+ struct FilterMethods {
689
+ using Methods = Valuelist<filter_methods...>;
690
+ using Idxs = std::make_index_sequence<sizeof...(filter_methods)>;
691
+ };
692
+
693
+ template <typename... Filters>
694
+ struct FilterTypes {
695
+ using Types = Typelist<Filters...>;
696
+ using Idxs = std::make_index_sequence<sizeof...(Filters)>;
697
+ };
698
+
699
+ template <std::size_t, typename FilterTypeList, typename Ignored = void>
700
+ struct TypesFromIdx;
701
+
702
+ template <typename... Filters>
703
+ struct TypesFromIdx<0, Typelist<Filters...>> {
704
+ using Types = Typelist<Filters...>;
705
+ };
706
+
707
+ template <std::size_t N, typename Filter0, typename... Filters>
708
+ struct TypesFromIdx<N, Typelist<Filter0, Filters...>,
709
+ std::enable_if_t<N != 0>> {
710
+ using Types = typename TypesFromIdx<N - 1, Typelist<Filters...>>::Types;
711
+ };
712
+
713
+ template <std::size_t, typename>
714
+ struct make_reverse_index_sequence_helper;
715
+
716
+ template <std::size_t N, std::size_t... NN>
717
+ struct make_reverse_index_sequence_helper<N, std::index_sequence<NN...>>
718
+ : std::index_sequence<(N - NN)...> {};
719
+
720
+ template <size_t N>
721
+ struct make_reverse_index_sequence
722
+ : make_reverse_index_sequence_helper<
723
+ N - 1, decltype(std::make_index_sequence<N>{})> {};
724
+
725
+ template <auto... filter_methods>
726
+ struct ReverseFilterMethods {
727
+ using Methods = ReverseValues<filter_methods...>;
728
+ using Idxs = make_reverse_index_sequence<sizeof...(filter_methods)>;
729
+ };
730
+
731
+ template <typename... Filters>
732
+ struct ReverseFilterTypes {
733
+ using Types = Reverse<Filters...>;
734
+ using Idxs = make_reverse_index_sequence<sizeof...(Filters)>;
735
+ template <bool forward, auto... filter_methods>
736
+ struct ForwardOrReverse;
737
+ };
738
+
739
+ template <bool forward, auto... filter_methods>
740
+ struct ForwardOrReverse;
741
+
742
+ template <auto... filter_methods>
743
+ struct ForwardOrReverse<true, filter_methods...> {
744
+ using OrderMethod = FilterMethods<filter_methods...>;
745
+ };
746
+
747
+ template <auto... filter_methods>
748
+ struct ForwardOrReverse<false, filter_methods...> {
749
+ using OrderMethod = ReverseFilterMethods<filter_methods...>;
750
+ };
751
+
752
+ template <bool forward, typename... filter_types>
753
+ struct ForwardOrReverseTypes;
754
+
755
+ template <typename... filter_types>
756
+ struct ForwardOrReverseTypes<true, filter_types...> {
757
+ using OrderMethod = FilterTypes<filter_types...>;
758
+ };
759
+
760
+ template <typename... filter_types>
761
+ struct ForwardOrReverseTypes<false, filter_types...> {
762
+ using OrderMethod = ReverseFilterTypes<filter_types...>;
763
+ };
764
+
765
+ // Combine the result of a series of filter methods into a single method.
766
+ template <typename Call, typename T, auto filter_method_0,
767
+ auto... filter_methods, size_t I0, size_t... Is>
768
+ auto ExecuteCombined(Call* call, Hdl<T> hdl,
769
+ Valuelist<filter_method_0, filter_methods...>,
770
+ std::index_sequence<I0, Is...>) {
771
+ return TrySeq(AdaptMethod<T, decltype(filter_method_0), filter_method_0>(
772
+ call->template fused_child<I0>())(std::move(hdl)),
773
+ AdaptMethod<T, decltype(filter_methods), filter_methods>(
774
+ call->template fused_child<Is>())...);
775
+ }
776
+
777
+ template <typename FilterMethods, typename Call, typename T>
778
+ auto ExecuteCombined(Call* call, Hdl<T> hdl) {
779
+ return ExecuteCombined(call, std::move(hdl),
780
+ typename FilterMethods::Methods(),
781
+ typename FilterMethods::Idxs());
782
+ }
783
+
784
+ // Combine the result of a series of filter methods into a single method.
785
+ template <typename Call, typename Derived, typename T, typename Filter0,
786
+ typename... Filters, auto filter_method_0, auto... filter_methods,
787
+ size_t I0, size_t... Is>
788
+ auto ExecuteCombinedWithChannelAccess(
789
+ Call* call, Derived* channel, Hdl<T> hdl, Typelist<Filter0, Filters...>,
790
+ Valuelist<filter_method_0, filter_methods...>,
791
+ std::index_sequence<I0, Is...>) {
792
+ return TrySeq(
793
+ AdaptMethod<T, decltype(filter_method_0), filter_method_0>(
794
+ call->template fused_child<I0>(),
795
+ reinterpret_cast<Filter0*>(channel->template get_fused_filter<I0>()))(
796
+ std::move(hdl)),
797
+ AdaptMethod<T, decltype(filter_methods), filter_methods>(
798
+ call->template fused_child<Is>(),
799
+ reinterpret_cast<Filters*>(
800
+ channel->template get_fused_filter<Is>()))...);
801
+ }
802
+
803
+ template <typename FilterMethods, typename FilterTypes, typename Call,
804
+ typename Derived, typename T>
805
+ auto ExecuteCombinedWithChannelAccess(Call* call, Derived* channel,
806
+ Hdl<T> hdl) {
807
+ return ExecuteCombinedWithChannelAccess(
808
+ call, channel, std::move(hdl), typename FilterTypes::Types(),
809
+ typename FilterMethods::Methods(), typename FilterMethods::Idxs());
810
+ }
811
+
812
+ // Combine the result of a series of OnFinalize filter methods into a single
813
+ // method.
814
+ template <typename Call, typename Derived, typename T, typename... Filters,
815
+ auto... filter_methods, size_t... Is>
816
+ void ExecuteCombinedOnFinalizeWithChannelAccess(Call* call, Derived* channel,
817
+ T* call_final_info,
818
+ Typelist<Filters...>,
819
+ Valuelist<filter_methods...>,
820
+ std::index_sequence<Is...>) {
821
+ (AdaptMethod<T, decltype(filter_methods), filter_methods>(
822
+ call->template fused_child<Is>(),
823
+ reinterpret_cast<Filters*>(channel->template get_fused_filter<Is>()))(
824
+ call_final_info),
825
+ ...);
826
+ }
827
+
828
+ template <typename Call, typename T, auto... filter_methods, size_t... Is>
829
+ void ExecuteCombinedOnFinalize(Call* call, T* call_final_info,
830
+ Valuelist<filter_methods...>,
831
+ std::index_sequence<Is...>) {
832
+ (AdaptMethod<T, decltype(filter_methods), filter_methods>(
833
+ call->template fused_child<Is>(), nullptr)(call_final_info),
834
+ ...);
835
+ }
836
+
837
+ // Combine the result of a series of OnServerTrailingMetadata filter methods
838
+ // into a single method.
839
+ template <typename Call, typename Derived, typename T, typename... Filters,
840
+ auto... filter_methods, size_t... Is>
841
+ void ExecuteCombinedOnServerTrailingMetadataWithChannelAccess(
842
+ Call* call, Derived* channel, T& metadata, Typelist<Filters...>,
843
+ Valuelist<filter_methods...>, std::index_sequence<Is...>) {
844
+ (AdaptOnServerTrailingMetadataMethod<T, decltype(filter_methods),
845
+ filter_methods>(
846
+ call->template fused_child<Is>(),
847
+ reinterpret_cast<Filters*>(channel->template get_fused_filter<Is>()))(
848
+ metadata),
849
+ ...);
850
+ }
851
+
852
+ template <typename FilterMethods, typename FilterTypes, typename Call,
853
+ typename Derived, typename T>
854
+ void ExecuteCombinedOnServerTrailingMetadataWithChannelAccess(Call* call,
855
+ Derived* channel,
856
+ T& metadata) {
857
+ ExecuteCombinedOnServerTrailingMetadataWithChannelAccess(
858
+ call, channel, metadata, typename FilterTypes::Types(),
859
+ typename FilterMethods::Methods(), typename FilterMethods::Idxs());
860
+ }
861
+
862
+ template <typename Call, typename T, auto... filter_methods, size_t... Is>
863
+ void ExecuteCombinedOnServerTrailingMetadata(Call* call, T& metadata,
864
+ Valuelist<filter_methods...>,
865
+ std::index_sequence<Is...>) {
866
+ (AdaptOnServerTrailingMetadataMethod<T, decltype(filter_methods),
867
+ filter_methods>(
868
+ call->template fused_child<Is>(), nullptr)(metadata),
869
+ ...);
870
+ }
871
+
872
+ template <typename FilterMethods, typename Call, typename T>
873
+ void ExecuteCombinedOnServerTrailingMetadata(Call* call, T& metadata) {
874
+ ExecuteCombinedOnServerTrailingMetadata(call, metadata,
875
+ typename FilterMethods::Methods(),
876
+ typename FilterMethods::Idxs());
877
+ }
878
+
879
+ template <typename Call, auto... filter_methods, size_t... Is>
880
+ void ExecuteCombinedOnClientToServerHalfClose(Call* call,
881
+ Valuelist<filter_methods...>,
882
+ std::index_sequence<Is...>) {
883
+ (AdaptOnClientToServerHalfCloseMethod<decltype(filter_methods),
884
+ filter_methods>(
885
+ call->template fused_child<Is>())(),
886
+ ...);
887
+ }
888
+
889
+ template <typename FilterMethods, typename Call>
890
+ void ExecuteCombinedOnClientToServerHalfClose(Call* call) {
891
+ ExecuteCombinedOnClientToServerHalfClose(
892
+ call, typename FilterMethods::Methods(), typename FilterMethods::Idxs());
893
+ }
894
+
895
+ template <typename FilterMethods, typename FilterTypes, typename Call,
896
+ typename Derived, typename T>
897
+ void ExecuteCombinedWithChannelAccess(Call* call, Derived* channel,
898
+ T* call_final_info) {
899
+ ExecuteCombinedOnFinalizeWithChannelAccess(
900
+ call, channel, call_final_info, typename FilterTypes::Types(),
901
+ typename FilterMethods::Methods(), typename FilterMethods::Idxs());
902
+ }
903
+
904
+ template <typename FilterMethods, typename Call, typename T>
905
+ void ExecuteCombined(Call* call, T* call_final_info) {
906
+ ExecuteCombinedOnFinalize(call, call_final_info,
907
+ typename FilterMethods::Methods(),
908
+ typename FilterMethods::Idxs());
909
+ }
910
+
911
+ #define GRPC_FUSE_METHOD(name, type, forward) \
912
+ template <MethodVariant variant, typename Derived, typename... Filters> \
913
+ class FuseImpl##name; \
914
+ template <typename Derived, typename... Filters> \
915
+ class FuseImpl##name<MethodVariant::kNoInterceptor, Derived, Filters...> { \
916
+ public: \
917
+ static inline const NoInterceptor name; \
918
+ }; \
919
+ template <typename Derived, typename... Filters> \
920
+ class FuseImpl##name<MethodVariant::kSimple, Derived, Filters...> { \
921
+ public: \
922
+ auto name(type x) { \
923
+ return ExecuteCombined<typename ForwardOrReverse< \
924
+ forward, &Filters::Call::name...>::OrderMethod>( \
925
+ static_cast<typename Derived::Call*>(this), std::move(x)); \
926
+ } \
927
+ }; \
928
+ template <typename Derived, typename... Filters> \
929
+ class FuseImpl##name<MethodVariant::kChannelAccess, Derived, Filters...> { \
930
+ public: \
931
+ auto name(type x, Derived* channel) { \
932
+ return ExecuteCombinedWithChannelAccess< \
933
+ typename ForwardOrReverse<forward, \
934
+ &Filters::Call::name...>::OrderMethod, \
935
+ typename ForwardOrReverseTypes<forward, Filters...>::OrderMethod>( \
936
+ static_cast<typename Derived::Call*>(this), channel, std::move(x)); \
937
+ } \
938
+ }; \
939
+ template <typename Derived, typename... Filters> \
940
+ using Fuse##name = FuseImpl##name< \
941
+ MethodVariantForFilters<decltype(&Filters::Call::name)...>(), Derived, \
942
+ Filters...>
943
+
944
+ template <MethodVariant variant, typename Derived, typename... Filters>
945
+ class FuseImplOnServerTrailingMetadata;
946
+
947
+ template <typename Derived, typename... Filters>
948
+ class FuseImplOnServerTrailingMetadata<MethodVariant::kNoInterceptor, Derived,
949
+ Filters...> {
950
+ public:
951
+ static inline const NoInterceptor OnServerTrailingMetadata;
952
+ };
953
+
954
+ template <typename Derived, typename... Filters>
955
+ class FuseImplOnServerTrailingMetadata<MethodVariant::kSimple, Derived,
956
+ Filters...> {
957
+ public:
958
+ void OnServerTrailingMetadata(ServerMetadata& x) {
959
+ return ExecuteCombinedOnServerTrailingMetadata<typename ForwardOrReverse<
960
+ false, &Filters::Call::OnServerTrailingMetadata...>::OrderMethod>(
961
+ static_cast<typename Derived::Call*>(this), x);
962
+ }
963
+ };
964
+
965
+ template <typename Derived, typename... Filters>
966
+ class FuseImplOnServerTrailingMetadata<MethodVariant::kChannelAccess, Derived,
967
+ Filters...> {
968
+ public:
969
+ void OnServerTrailingMetadata(ServerMetadata& x, Derived* channel) {
970
+ return ExecuteCombinedOnServerTrailingMetadataWithChannelAccess<
971
+ typename ForwardOrReverse<
972
+ false, &Filters::Call::OnServerTrailingMetadata...>::OrderMethod,
973
+ typename ForwardOrReverseTypes<false, Filters...>::OrderMethod>(
974
+ static_cast<typename Derived::Call*>(this), channel, x);
975
+ }
976
+ };
977
+
978
+ template <typename Derived, typename... Filters>
979
+ using FuseOnServerTrailingMetadata = FuseImplOnServerTrailingMetadata<
980
+ MethodVariantForFilters<
981
+ decltype(&Filters::Call::OnServerTrailingMetadata)...>(),
982
+ Derived, Filters...>;
983
+
984
+ template <bool is_no_interceptor, typename Derived, typename... Filters>
985
+ class FuseImplOnClientToServerHalfClose;
986
+
987
+ template <typename Derived, typename... Filters>
988
+ class FuseImplOnClientToServerHalfClose<true, Derived, Filters...> {
989
+ public:
990
+ static inline const NoInterceptor OnClientToServerHalfClose;
991
+ };
992
+
993
+ template <typename Derived, typename... Filters>
994
+ class FuseImplOnClientToServerHalfClose<false, Derived, Filters...> {
995
+ public:
996
+ void OnClientToServerHalfClose() {
997
+ return ExecuteCombinedOnClientToServerHalfClose<typename ForwardOrReverse<
998
+ true, &Filters::Call::OnClientToServerHalfClose...>::OrderMethod>(
999
+ static_cast<typename Derived::Call*>(this));
1000
+ }
1001
+ };
1002
+
1003
+ template <typename Derived, typename... Filters>
1004
+ using FuseOnClientToServerHalfClose = FuseImplOnClientToServerHalfClose<
1005
+ AllNoInterceptor<decltype(&Filters::Call::OnClientToServerHalfClose)...>,
1006
+ Derived, Filters...>;
1007
+
1008
+ GRPC_FUSE_METHOD(OnClientInitialMetadata, ClientMetadataHandle, true);
1009
+ GRPC_FUSE_METHOD(OnServerInitialMetadata, ServerMetadataHandle, false);
1010
+ GRPC_FUSE_METHOD(OnClientToServerMessage, MessageHandle, true);
1011
+ GRPC_FUSE_METHOD(OnServerToClientMessage, MessageHandle, false);
1012
+ GRPC_FUSE_METHOD(OnFinalize, const grpc_call_final_info*, true);
1013
+
1014
+ template <typename FilterTypelist>
1015
+ struct FilterWrapper;
1016
+
1017
+ template <typename Filter>
1018
+ struct FilterWrapper<Typelist<Filter>> {
1019
+ FilterWrapper(const ChannelArgs& args, ChannelFilter::Args filter_args)
1020
+ : filter_(Filter::Create(args, filter_args)) {}
1021
+
1022
+ absl::Status status() const { return filter_.status(); }
1023
+ bool StartTransportOp(grpc_transport_op* op) {
1024
+ CHECK(filter_.ok());
1025
+ return (*filter_)->StartTransportOp(op);
1026
+ }
1027
+
1028
+ Filter* get_filter() { return (*filter_).get(); }
1029
+
1030
+ bool GetChannelInfo(const grpc_channel_info* info) {
1031
+ CHECK(filter_.ok());
1032
+ return (*filter_)->GetChannelInfo(info);
1033
+ }
1034
+
1035
+ private:
1036
+ absl::StatusOr<std::unique_ptr<Filter>> filter_;
1037
+ };
1038
+
1039
+ template <typename Filter0, typename... Filters>
1040
+ struct FilterWrapper<Typelist<Filter0, Filters...>>
1041
+ : public FilterWrapper<Typelist<Filters...>> {
1042
+ FilterWrapper(const ChannelArgs& args, ChannelFilter::Args filter_args)
1043
+ : FilterWrapper<Typelist<Filters...>>(args, filter_args),
1044
+ filter0_(Filter0::Create(args, filter_args)) {}
1045
+
1046
+ absl::Status status() const {
1047
+ if (filter0_.ok()) {
1048
+ return FilterWrapper<Typelist<Filters...>>::status();
1049
+ }
1050
+ return filter0_.status();
1051
+ }
1052
+
1053
+ Filter0* get_filter() { return (*filter0_).get(); }
1054
+
1055
+ bool StartTransportOp(grpc_transport_op* op) {
1056
+ CHECK(filter0_.ok());
1057
+ return (*filter0_)->StartTransportOp(op) ||
1058
+ FilterWrapper<Typelist<Filters...>>::StartTransportOp(op);
1059
+ }
1060
+
1061
+ bool GetChannelInfo(const grpc_channel_info* info) {
1062
+ CHECK(filter0_.ok());
1063
+ return (*filter0_)->GetChannelInfo(info) ||
1064
+ FilterWrapper<Typelist<Filters...>>::GetChannelInfo(info);
1065
+ }
1066
+
1067
+ private:
1068
+ absl::StatusOr<std::unique_ptr<Filter0>> filter0_;
1069
+ };
1070
+
1071
+ template <typename Derived, typename SfinaeVoid = void>
1072
+ struct ConstructCall;
1073
+
1074
+ template <typename Derived>
1075
+ struct ConstructCall<Derived, absl::void_t<decltype(typename Derived::Call(
1076
+ std::declval<Derived*>()))>> {
1077
+ public:
1078
+ using Call = typename Derived::Call;
1079
+ static void Run(ManualConstructor<Call>& call, Derived* channel) {
1080
+ call.Init(channel);
1081
+ }
1082
+ };
1083
+
1084
+ template <typename Derived>
1085
+ struct ConstructCall<Derived,
1086
+ absl::void_t<decltype(typename Derived::Call())>> {
1087
+ public:
1088
+ using Call = typename Derived::Call;
1089
+ static void Run(ManualConstructor<Call>& call, Derived* /*channel*/) {
1090
+ call.Init();
1091
+ }
1092
+ };
1093
+
1094
+ template <typename FilterTypelist>
1095
+ struct CallWrapper;
1096
+
1097
+ template <typename Filter>
1098
+ struct CallWrapper<Typelist<Filter>> {
1099
+ using Call = typename Filter::Call;
1100
+ explicit CallWrapper(FilterWrapper<Typelist<Filter>>* channel) {
1101
+ ConstructCall<Filter>::Run(call_, channel->get_filter());
1102
+ }
1103
+
1104
+ Call* get_call() { return call_.get(); }
1105
+
1106
+ ~CallWrapper() { call_.Destroy(); }
1107
+
1108
+ private:
1109
+ ManualConstructor<Call> call_;
1110
+ };
1111
+
1112
+ template <typename Filter0, typename... Filters>
1113
+ struct CallWrapper<Typelist<Filter0, Filters...>>
1114
+ : public CallWrapper<Typelist<Filters...>> {
1115
+ using Call = typename Filter0::Call;
1116
+ explicit CallWrapper(FilterWrapper<Typelist<Filter0, Filters...>>* channel)
1117
+ : CallWrapper<Typelist<Filters...>>(
1118
+ reinterpret_cast<FilterWrapper<Typelist<Filters...>>*>(channel)) {
1119
+ ConstructCall<Filter0>::Run(call_, channel->get_filter());
1120
+ }
1121
+
1122
+ Call* get_call() { return call_.get(); }
1123
+
1124
+ ~CallWrapper() { call_.Destroy(); }
1125
+
1126
+ private:
1127
+ ManualConstructor<Call> call_;
1128
+ };
1129
+
1130
+ #undef GRPC_FUSE_METHOD
1131
+
1132
+ template <FilterEndpoint ep, uint8_t kFlags, typename... Filters>
1133
+ class FusedFilter
1134
+ : public ImplementChannelFilter<FusedFilter<ep, kFlags, Filters...>> {
1135
+ public:
1136
+ static const grpc_channel_filter kFilter;
1137
+
1138
+ static absl::string_view TypeName() {
1139
+ static const std::string kName =
1140
+ absl::StrCat(absl::StrJoin(std::tuple(Filters::TypeName()...), "+"));
1141
+ return kName;
1142
+ }
1143
+
1144
+ template <size_t I>
1145
+ auto* get_fused_filter() {
1146
+ return reinterpret_cast<FilterWrapper<
1147
+ typename TypesFromIdx<I, Typelist<Filters...>>::Types>*>(filters_.get())
1148
+ ->get_filter();
1149
+ }
1150
+
1151
+ FilterWrapper<Typelist<Filters...>>* get_wrapper() { return filters_.get(); }
1152
+
1153
+ static absl::StatusOr<std::unique_ptr<FusedFilter<ep, kFlags, Filters...>>>
1154
+ Create(const ChannelArgs& args, ChannelFilter::Args filter_args) {
1155
+ auto filters_wrapper =
1156
+ std::make_unique<FilterWrapper<Typelist<Filters...>>>(args,
1157
+ filter_args);
1158
+ GRPC_RETURN_IF_ERROR(filters_wrapper->status());
1159
+ return absl::WrapUnique<FusedFilter<ep, kFlags, Filters...>>(
1160
+ new FusedFilter<ep, kFlags, Filters...>(std::move(filters_wrapper)));
1161
+ }
1162
+
1163
+ static constexpr bool IsFused = true;
1164
+
1165
+ class Call : public FuseOnClientInitialMetadata<FusedFilter, Filters...>,
1166
+ public FuseOnServerInitialMetadata<FusedFilter, Filters...>,
1167
+ public FuseOnClientToServerMessage<FusedFilter, Filters...>,
1168
+ public FuseOnServerToClientMessage<FusedFilter, Filters...>,
1169
+ public FuseOnServerTrailingMetadata<FusedFilter, Filters...>,
1170
+ public FuseOnClientToServerHalfClose<FusedFilter, Filters...>,
1171
+ public FuseOnFinalize<FusedFilter, Filters...> {
1172
+ public:
1173
+ using Idxs = std::make_index_sequence<sizeof...(Filters)>;
1174
+ template <size_t I>
1175
+ auto* fused_child() {
1176
+ return reinterpret_cast<CallWrapper<
1177
+ typename TypesFromIdx<I, Typelist<Filters...>>::Types>*>(
1178
+ &filter_calls_)
1179
+ ->get_call();
1180
+ }
1181
+
1182
+ explicit Call(FusedFilter<ep, kFlags, Filters...>* filter)
1183
+ : filter_calls_(filter->get_wrapper()) {};
1184
+
1185
+ using FuseOnClientInitialMetadata<FusedFilter,
1186
+ Filters...>::OnClientInitialMetadata;
1187
+ using FuseOnServerInitialMetadata<FusedFilter,
1188
+ Filters...>::OnServerInitialMetadata;
1189
+ using FuseOnClientToServerMessage<FusedFilter,
1190
+ Filters...>::OnClientToServerMessage;
1191
+ using FuseOnServerToClientMessage<FusedFilter,
1192
+ Filters...>::OnServerToClientMessage;
1193
+ using FuseOnServerTrailingMetadata<FusedFilter,
1194
+ Filters...>::OnServerTrailingMetadata;
1195
+ using FuseOnClientToServerHalfClose<FusedFilter,
1196
+ Filters...>::OnClientToServerHalfClose;
1197
+ using FuseOnFinalize<FusedFilter, Filters...>::OnFinalize;
1198
+
1199
+ private:
1200
+ CallWrapper<Typelist<Filters...>> filter_calls_;
1201
+ };
1202
+
1203
+ bool StartTransportOp(grpc_transport_op* op) override {
1204
+ return filters_->StartTransportOp(op);
1205
+ }
1206
+
1207
+ bool GetChannelInfo(const grpc_channel_info* info) override {
1208
+ return filters_->GetChannelInfo(info);
1209
+ }
1210
+
1211
+ private:
1212
+ explicit FusedFilter(
1213
+ std::unique_ptr<FilterWrapper<Typelist<Filters...>>> filters)
1214
+ : filters_(std::move(filters)) {};
1215
+
1216
+ std::unique_ptr<FilterWrapper<Typelist<Filters...>>> filters_;
1217
+ };
1218
+
1219
+ template <FilterEndpoint ep, uint8_t kFlags, typename... Filters>
1220
+ const grpc_channel_filter FusedFilter<ep, kFlags, Filters...>::kFilter =
1221
+ MakePromiseBasedFilter<FusedFilter<ep, kFlags, Filters...>, ep, kFlags>();
1222
+
1223
+ } // namespace filters_detail
1224
+
1225
+ template <FilterEndpoint ep, uint8_t kFlags, typename... Filters>
1226
+ using FusedFilter = filters_detail::FusedFilter<ep, kFlags, Filters...>;
1227
+
1228
+ } // namespace grpc_core
1229
+
1230
+ #endif // GRPC_SRC_CORE_CALL_FILTER_FUSION_H