couchbase 3.7.0 → 3.8.1

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 (349) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/ext/CMakeLists.txt +4 -1
  4. data/ext/cache/extconf_include.rb +4 -3
  5. data/ext/cache/mozilla-ca-bundle.crt +66 -665
  6. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  7. data/ext/couchbase/CMakeLists.txt +26 -11
  8. data/ext/couchbase/cmake/APKBUILD.in +17 -1
  9. data/ext/couchbase/cmake/Bundler.cmake +9 -1
  10. data/ext/couchbase/cmake/Cache.cmake +48 -19
  11. data/ext/couchbase/cmake/CompilerOptions.cmake +3 -1
  12. data/ext/couchbase/cmake/OpenSSL.cmake +10 -2
  13. data/ext/couchbase/cmake/Packaging.cmake +48 -8
  14. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +43 -1
  15. data/ext/couchbase/cmake/build_config.hxx.in +2 -0
  16. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +18 -0
  17. data/ext/couchbase/cmake/tarball_glob.txt +10 -0
  18. data/ext/couchbase/core/app_telemetry_meter.cxx +1 -0
  19. data/ext/couchbase/core/app_telemetry_reporter.cxx +45 -43
  20. data/ext/couchbase/core/app_telemetry_reporter.hxx +4 -3
  21. data/ext/couchbase/core/bucket.cxx +128 -13
  22. data/ext/couchbase/core/bucket.hxx +12 -2
  23. data/ext/couchbase/core/cluster.cxx +304 -152
  24. data/ext/couchbase/core/cluster.hxx +32 -0
  25. data/ext/couchbase/core/cluster_credentials.cxx +25 -0
  26. data/ext/couchbase/core/cluster_credentials.hxx +5 -0
  27. data/ext/couchbase/core/cluster_label_listener.cxx +72 -0
  28. data/ext/couchbase/core/cluster_label_listener.hxx +46 -0
  29. data/ext/couchbase/core/cluster_options.hxx +4 -0
  30. data/ext/couchbase/core/deprecation_utils.hxx +26 -0
  31. data/ext/couchbase/core/error.hxx +27 -0
  32. data/ext/couchbase/core/error_context/base_error_context.hxx +32 -0
  33. data/ext/couchbase/core/error_context/key_value.cxx +1 -0
  34. data/ext/couchbase/core/error_context/key_value.hxx +23 -0
  35. data/ext/couchbase/core/error_context/key_value_error_context.hxx +35 -0
  36. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +41 -0
  37. data/ext/couchbase/core/free_form_http_request.hxx +0 -2
  38. data/ext/couchbase/core/http_component.cxx +12 -48
  39. data/ext/couchbase/core/impl/analytics.cxx +3 -2
  40. data/ext/couchbase/core/impl/analytics.hxx +2 -1
  41. data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
  42. data/ext/couchbase/core/impl/binary_collection.cxx +239 -128
  43. data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
  44. data/ext/couchbase/core/impl/collection.cxx +914 -372
  45. data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
  46. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
  47. data/ext/couchbase/core/impl/error.cxx +49 -17
  48. data/ext/couchbase/core/impl/error.hxx +15 -10
  49. data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
  50. data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
  51. data/ext/couchbase/core/impl/get_replica.hxx +2 -0
  52. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +44 -0
  53. data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
  54. data/ext/couchbase/core/impl/node_id.cxx +110 -0
  55. data/ext/couchbase/core/impl/node_id.hxx +40 -0
  56. data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
  57. data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
  58. data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
  59. data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
  60. data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
  61. data/ext/couchbase/core/impl/query.cxx +6 -3
  62. data/ext/couchbase/core/impl/query.hxx +3 -1
  63. data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
  64. data/ext/couchbase/core/impl/scope.cxx +53 -11
  65. data/ext/couchbase/core/impl/search.cxx +8 -4
  66. data/ext/couchbase/core/impl/search.hxx +6 -2
  67. data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
  68. data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
  69. data/ext/couchbase/core/io/config_tracker.cxx +9 -9
  70. data/ext/couchbase/core/io/config_tracker.hxx +2 -1
  71. data/ext/couchbase/core/io/http_command.hxx +98 -49
  72. data/ext/couchbase/core/io/http_context.hxx +2 -0
  73. data/ext/couchbase/core/io/http_session.cxx +23 -10
  74. data/ext/couchbase/core/io/http_session.hxx +17 -9
  75. data/ext/couchbase/core/io/http_session_manager.hxx +245 -270
  76. data/ext/couchbase/core/io/http_traits.hxx +0 -7
  77. data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
  78. data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
  79. data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
  80. data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
  81. data/ext/couchbase/core/io/streams.cxx +3 -3
  82. data/ext/couchbase/core/io/streams.hxx +3 -2
  83. data/ext/couchbase/core/meta/features.hxx +15 -0
  84. data/ext/couchbase/core/meta/version.cxx +13 -0
  85. data/ext/couchbase/core/meta/version.hxx +3 -0
  86. data/ext/couchbase/core/metrics/constants.hxx +23 -0
  87. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
  88. data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
  89. data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
  90. data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
  91. data/ext/couchbase/core/operations/document_append.hxx +0 -4
  92. data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
  93. data/ext/couchbase/core/operations/document_exists.hxx +0 -7
  94. data/ext/couchbase/core/operations/document_get.hxx +0 -7
  95. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +89 -29
  96. data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
  97. data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
  98. data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
  99. data/ext/couchbase/core/operations/document_get_projected.cxx +3 -4
  100. data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
  101. data/ext/couchbase/core/operations/document_increment.hxx +0 -5
  102. data/ext/couchbase/core/operations/document_insert.hxx +0 -4
  103. data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
  104. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +50 -4
  105. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
  106. data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
  107. data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
  108. data/ext/couchbase/core/operations/document_query.cxx +12 -12
  109. data/ext/couchbase/core/operations/document_query.hxx +0 -4
  110. data/ext/couchbase/core/operations/document_remove.hxx +0 -4
  111. data/ext/couchbase/core/operations/document_replace.hxx +0 -4
  112. data/ext/couchbase/core/operations/document_search.hxx +0 -7
  113. data/ext/couchbase/core/operations/document_touch.hxx +0 -7
  114. data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
  115. data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
  116. data/ext/couchbase/core/operations/document_view.cxx +2 -0
  117. data/ext/couchbase/core/operations/document_view.hxx +10 -13
  118. data/ext/couchbase/core/operations/http_noop.hxx +2 -0
  119. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
  120. data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
  121. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
  122. data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
  123. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
  124. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
  125. data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
  126. data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
  127. data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
  128. data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
  129. data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
  130. data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
  131. data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
  132. data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
  133. data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
  134. data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
  135. data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
  136. data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
  137. data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
  138. data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
  139. data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
  140. data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
  141. data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
  142. data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
  143. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
  144. data/ext/couchbase/core/operations/management/collection_create.cxx +11 -11
  145. data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
  146. data/ext/couchbase/core/operations/management/collection_drop.cxx +11 -11
  147. data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
  148. data/ext/couchbase/core/operations/management/collection_update.cxx +11 -11
  149. data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
  150. data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
  151. data/ext/couchbase/core/operations/management/error_utils.cxx +13 -7
  152. data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
  153. data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
  154. data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
  155. data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
  156. data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
  157. data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
  158. data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
  159. data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
  160. data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
  161. data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
  162. data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
  163. data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
  164. data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
  165. data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
  166. data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
  167. data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
  168. data/ext/couchbase/core/operations/management/query_index_create.cxx +5 -4
  169. data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
  170. data/ext/couchbase/core/operations/management/query_index_drop.cxx +7 -6
  171. data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
  172. data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
  173. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
  174. data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
  175. data/ext/couchbase/core/operations/management/scope_create.cxx +12 -13
  176. data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
  177. data/ext/couchbase/core/operations/management/scope_drop.cxx +8 -9
  178. data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
  179. data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
  180. data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
  181. data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
  182. data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
  183. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
  184. data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
  185. data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
  186. data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
  187. data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
  188. data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
  189. data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
  190. data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
  191. data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
  192. data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
  193. data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
  194. data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
  195. data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
  196. data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
  197. data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
  198. data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
  199. data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
  200. data/ext/couchbase/core/operations.hxx +0 -1
  201. data/ext/couchbase/core/operations_fwd.hxx +8 -0
  202. data/ext/couchbase/core/origin.cxx +67 -12
  203. data/ext/couchbase/core/origin.hxx +13 -8
  204. data/ext/couchbase/core/orphan_reporter.cxx +164 -0
  205. data/ext/couchbase/core/orphan_reporter.hxx +65 -0
  206. data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
  207. data/ext/couchbase/core/sasl/client.cc +6 -0
  208. data/ext/couchbase/core/sasl/mechanism.cc +2 -1
  209. data/ext/couchbase/core/sasl/mechanism.h +2 -1
  210. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
  211. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
  212. data/ext/couchbase/core/tls_context_provider.cxx +44 -0
  213. data/ext/couchbase/core/tls_context_provider.hxx +44 -0
  214. data/ext/couchbase/core/topology/configuration.cxx +21 -0
  215. data/ext/couchbase/core/topology/configuration.hxx +28 -0
  216. data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
  217. data/ext/couchbase/core/tracing/constants.hxx +148 -68
  218. data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
  219. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
  220. data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
  221. data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
  222. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
  223. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
  224. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
  225. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
  226. data/ext/couchbase/core/transactions/transactions.cxx +1 -1
  227. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
  228. data/ext/couchbase/core/utils/byteswap.hxx +12 -0
  229. data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
  230. data/ext/couchbase/core/utils/connection_string.cxx +2 -0
  231. data/ext/couchbase/core/utils/contains_string.cxx +61 -0
  232. data/ext/couchbase/core/utils/contains_string.hxx +26 -0
  233. data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
  234. data/ext/couchbase/couchbase/cluster.hxx +47 -0
  235. data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
  236. data/ext/couchbase/couchbase/collection.hxx +133 -15
  237. data/ext/couchbase/couchbase/error.hxx +16 -0
  238. data/ext/couchbase/couchbase/error_codes.hxx +48 -48
  239. data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
  240. data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
  241. data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
  242. data/ext/couchbase/couchbase/network_options.hxx +19 -0
  243. data/ext/couchbase/couchbase/node_id.hxx +123 -0
  244. data/ext/couchbase/couchbase/node_id_for_options.hxx +61 -0
  245. data/ext/couchbase/couchbase/node_ids_options.hxx +62 -0
  246. data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
  247. data/ext/couchbase/couchbase/result.hxx +42 -0
  248. data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
  249. data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
  250. data/ext/couchbase.cxx +4 -0
  251. data/ext/extconf.rb +1 -0
  252. data/ext/rcb_analytics.cxx +157 -47
  253. data/ext/rcb_backend.cxx +118 -71
  254. data/ext/rcb_buckets.cxx +39 -16
  255. data/ext/rcb_collections.cxx +36 -12
  256. data/ext/rcb_crud.cxx +589 -294
  257. data/ext/rcb_hdr_histogram.cxx +219 -0
  258. data/ext/rcb_hdr_histogram.hxx +28 -0
  259. data/ext/rcb_logger.cxx +15 -17
  260. data/ext/rcb_multi.cxx +142 -59
  261. data/ext/rcb_observability.cxx +132 -0
  262. data/ext/rcb_observability.hxx +49 -0
  263. data/ext/rcb_query.cxx +77 -27
  264. data/ext/rcb_search.cxx +92 -31
  265. data/ext/rcb_users.cxx +69 -26
  266. data/ext/rcb_utils.cxx +91 -0
  267. data/ext/rcb_utils.hxx +141 -168
  268. data/ext/rcb_views.cxx +36 -12
  269. data/lib/active_support/cache/couchbase_store.rb +6 -6
  270. data/lib/couchbase/authenticator.rb +14 -0
  271. data/lib/couchbase/binary_collection.rb +37 -22
  272. data/lib/couchbase/bucket.rb +46 -31
  273. data/lib/couchbase/cluster.rb +146 -61
  274. data/lib/couchbase/collection.rb +257 -186
  275. data/lib/couchbase/datastructures/couchbase_list.rb +82 -50
  276. data/lib/couchbase/datastructures/couchbase_map.rb +87 -50
  277. data/lib/couchbase/datastructures/couchbase_queue.rb +65 -38
  278. data/lib/couchbase/datastructures/couchbase_set.rb +58 -41
  279. data/lib/couchbase/deprecations.rb +1 -1
  280. data/lib/couchbase/diagnostics.rb +8 -8
  281. data/lib/couchbase/errors.rb +7 -1
  282. data/lib/couchbase/json_transcoder.rb +1 -1
  283. data/lib/couchbase/management/analytics_index_manager.rb +90 -59
  284. data/lib/couchbase/management/bucket_manager.rb +73 -45
  285. data/lib/couchbase/management/collection_manager.rb +86 -43
  286. data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
  287. data/lib/couchbase/management/query_index_manager.rb +88 -36
  288. data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
  289. data/lib/couchbase/management/search_index_manager.rb +401 -178
  290. data/lib/couchbase/management/user_manager.rb +343 -174
  291. data/lib/couchbase/management/view_index_manager.rb +166 -73
  292. data/lib/couchbase/metrics/logging_meter.rb +108 -0
  293. data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
  294. data/lib/couchbase/metrics/meter.rb +27 -0
  295. data/lib/couchbase/metrics/noop_meter.rb +30 -0
  296. data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
  297. data/lib/couchbase/metrics/value_recorder.rb +25 -0
  298. data/lib/couchbase/options.rb +71 -5
  299. data/lib/couchbase/protostellar/client.rb +0 -2
  300. data/lib/couchbase/protostellar/cluster.rb +7 -0
  301. data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_pb.rb +54 -0
  302. data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_services_pb.rb +51 -0
  303. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +5 -24
  304. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +16 -0
  305. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +5 -24
  306. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +16 -0
  307. data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +5 -24
  308. data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +18 -0
  309. data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +2 -23
  310. data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +23 -0
  311. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +4 -25
  312. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +10 -0
  313. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +6 -25
  314. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +18 -0
  315. data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_pb.rb +46 -0
  316. data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_services_pb.rb +56 -0
  317. data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +3 -26
  318. data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +47 -0
  319. data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +4 -26
  320. data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +10 -0
  321. data/lib/couchbase/protostellar/generated/routing/v2/routing_pb.rb +26 -0
  322. data/lib/couchbase/protostellar/generated/routing/v2/routing_services_pb.rb +43 -0
  323. data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +5 -26
  324. data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +11 -0
  325. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +2 -23
  326. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +30 -0
  327. data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +2 -23
  328. data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +9 -0
  329. data/lib/couchbase/protostellar/request_generator/admin/collection.rb +4 -2
  330. data/lib/couchbase/protostellar/request_generator/admin/query.rb +2 -0
  331. data/lib/couchbase/protostellar/request_generator/kv.rb +1 -1
  332. data/lib/couchbase/protostellar/scope.rb +4 -0
  333. data/lib/couchbase/scope.rb +62 -48
  334. data/lib/couchbase/search_options.rb +18 -18
  335. data/lib/couchbase/tracing/noop_span.rb +29 -0
  336. data/lib/couchbase/tracing/noop_tracer.rb +29 -0
  337. data/lib/couchbase/tracing/request_span.rb +34 -0
  338. data/lib/couchbase/tracing/request_tracer.rb +28 -0
  339. data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
  340. data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
  341. data/lib/couchbase/utils/hdr_histogram.rb +55 -0
  342. data/lib/couchbase/utils/observability.rb +263 -0
  343. data/lib/couchbase/utils/observability_constants.rb +200 -0
  344. data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
  345. data/lib/couchbase/version.rb +1 -1
  346. data/lib/couchbase.rb +2 -2
  347. metadata +72 -8
  348. data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +0 -52
  349. data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +0 -30
@@ -26,6 +26,7 @@
26
26
 
27
27
  #include <tao/json.hpp>
28
28
 
29
+ #include <mutex>
29
30
  #include <random>
30
31
  #include <utility>
31
32
 
@@ -99,6 +100,19 @@ struct traits<couchbase::core::io::dns::dns_config> {
99
100
  }
100
101
  };
101
102
 
103
+ template<>
104
+ struct traits<couchbase::core::orphan_reporter_options> {
105
+ template<template<typename...> class Traits>
106
+ static void assign(tao::json::basic_value<Traits>& v,
107
+ const couchbase::core::orphan_reporter_options& o)
108
+ {
109
+ v = {
110
+ { "emit_interval", o.emit_interval },
111
+ { "sample_size", o.sample_size },
112
+ };
113
+ }
114
+ };
115
+
102
116
  template<>
103
117
  struct traits<couchbase::core::tracing::threshold_logging_options> {
104
118
  template<template<typename...> class Traits>
@@ -106,8 +120,6 @@ struct traits<couchbase::core::tracing::threshold_logging_options> {
106
120
  const couchbase::core::tracing::threshold_logging_options& o)
107
121
  {
108
122
  v = {
109
- { "orphaned_emit_interval", o.orphaned_emit_interval },
110
- { "orphaned_sample_size", o.orphaned_sample_size },
111
123
  { "threshold_emit_interval", o.threshold_emit_interval },
112
124
  { "threshold_sample_size", o.threshold_sample_size },
113
125
  { "key_value_threshold", o.key_value_threshold },
@@ -275,12 +287,14 @@ origin::to_json() const -> std::string
275
287
  { "enable_compression", options_.enable_compression },
276
288
  { "enable_tracing", options_.enable_tracing },
277
289
  { "enable_metrics", options_.enable_metrics },
290
+ { "enable_orphan_reporting", options_.enable_orphan_reporting },
278
291
  { "tcp_keep_alive_interval", options_.tcp_keep_alive_interval },
279
292
  { "config_idle_redial_timeout", options_.config_idle_redial_timeout },
280
293
  { "max_http_connections", options_.max_http_connections },
281
294
  { "idle_http_connection_timeout", options_.idle_http_connection_timeout },
282
295
  { "metrics_options", options_.metrics_options },
283
296
  { "tracing_options", options_.tracing_options },
297
+ { "orphan_reporter_options", options_.orphan_options },
284
298
  { "transactions_options", options_.transactions },
285
299
  { "server_group", options_.server_group },
286
300
  #endif
@@ -302,12 +316,36 @@ origin::to_json() const -> std::string
302
316
 
303
317
  } // namespace couchbase::core
304
318
 
319
+ couchbase::core::origin::origin(origin&& other) noexcept
320
+ : options_(std::move(other.options_))
321
+ , nodes_(std::move(other.nodes_))
322
+ , next_node_(other.next_node_)
323
+ , exhausted_(other.exhausted_)
324
+ , connection_string_(std::move(other.connection_string_))
325
+ , credentials_(std::move(other.credentials_))
326
+ {
327
+ }
328
+
329
+ auto
330
+ couchbase::core::origin::operator=(origin&& other) noexcept -> origin&
331
+ {
332
+ if (this != &other) {
333
+ options_ = std::move(other.options_);
334
+ nodes_ = std::move(other.nodes_);
335
+ next_node_ = other.next_node_;
336
+ exhausted_ = other.exhausted_;
337
+ connection_string_ = std::move(other.connection_string_);
338
+ credentials_ = std::move(other.credentials_);
339
+ }
340
+ return *this;
341
+ }
342
+
305
343
  couchbase::core::origin::origin(const couchbase::core::origin& other)
306
344
  : options_(other.options_)
307
- , credentials_(other.credentials_)
308
345
  , nodes_(other.nodes_)
309
346
  , next_node_(nodes_.begin())
310
347
  {
348
+ update_credentials(other.credentials());
311
349
  }
312
350
 
313
351
  couchbase::core::origin::origin(origin other, const topology::configuration& config)
@@ -321,9 +359,9 @@ couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
321
359
  std::uint16_t port,
322
360
  couchbase::core::cluster_options options)
323
361
  : options_(std::move(options))
324
- , credentials_(std::move(auth))
325
362
  , nodes_{ { hostname, std::to_string(port) } }
326
363
  , next_node_(nodes_.begin())
364
+ , credentials_(std::move(auth))
327
365
  {
328
366
  }
329
367
  couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
@@ -331,16 +369,16 @@ couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
331
369
  const std::string& port,
332
370
  couchbase::core::cluster_options options)
333
371
  : options_(std::move(options))
334
- , credentials_(std::move(auth))
335
372
  , nodes_{ { hostname, port } }
336
373
  , next_node_(nodes_.begin())
374
+ , credentials_(std::move(auth))
337
375
  {
338
376
  }
339
377
  couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
340
378
  const couchbase::core::utils::connection_string& connstr)
341
379
  : options_(connstr.options)
342
- , credentials_(std::move(auth))
343
380
  , connection_string_(connstr.input)
381
+ , credentials_(std::move(auth))
344
382
  {
345
383
  nodes_.reserve(connstr.bootstrap_nodes.size());
346
384
  for (const auto& node : connstr.bootstrap_nodes) {
@@ -358,7 +396,7 @@ couchbase::core::origin::operator=(const couchbase::core::origin& other) -> couc
358
396
  {
359
397
  if (this != &other) {
360
398
  options_ = other.options_;
361
- credentials_ = other.credentials_;
399
+ update_credentials(other.credentials());
362
400
  nodes_ = other.nodes_;
363
401
  next_node_ = nodes_.begin();
364
402
  exhausted_ = false;
@@ -371,26 +409,36 @@ couchbase::core::origin::connection_string() const -> const std::string&
371
409
  return connection_string_;
372
410
  }
373
411
  auto
374
- couchbase::core::origin::username() const -> const std::string&
412
+ couchbase::core::origin::username() const -> std::string
375
413
  {
414
+ const std::shared_lock lock(credentials_mutex_);
376
415
  return credentials_.username;
377
416
  }
378
417
  auto
379
- couchbase::core::origin::password() const -> const std::string&
418
+ couchbase::core::origin::password() const -> std::string
380
419
  {
420
+ const std::shared_lock lock(credentials_mutex_);
381
421
  return credentials_.password;
382
422
  }
383
423
  auto
384
- couchbase::core::origin::certificate_path() const -> const std::string&
424
+ couchbase::core::origin::certificate_path() const -> std::string
385
425
  {
426
+ const std::shared_lock lock(credentials_mutex_);
386
427
  return credentials_.certificate_path;
387
428
  }
388
429
  auto
389
- couchbase::core::origin::key_path() const -> const std::string&
430
+ couchbase::core::origin::key_path() const -> std::string
390
431
  {
432
+ const std::shared_lock lock(credentials_mutex_);
391
433
  return credentials_.key_path;
392
434
  }
393
435
  auto
436
+ couchbase::core::origin::jwt_token() const -> std::string
437
+ {
438
+ const std::shared_lock lock(credentials_mutex_);
439
+ return credentials_.jwt_token;
440
+ }
441
+ auto
394
442
  couchbase::core::origin::get_hostnames() const -> std::vector<std::string>
395
443
  {
396
444
  std::vector<std::string> res;
@@ -455,6 +503,12 @@ couchbase::core::origin::set_nodes_from_config(const topology::configuration& co
455
503
  }
456
504
  next_node_ = nodes_.begin();
457
505
  }
506
+ void
507
+ couchbase::core::origin::update_credentials(cluster_credentials auth)
508
+ {
509
+ const std::unique_lock lock(credentials_mutex_);
510
+ credentials_ = std::move(auth);
511
+ }
458
512
  auto
459
513
  couchbase::core::origin::next_address() -> std::pair<std::string, std::string>
460
514
  {
@@ -490,7 +544,8 @@ couchbase::core::origin::options() -> couchbase::core::cluster_options&
490
544
  return options_;
491
545
  }
492
546
  auto
493
- couchbase::core::origin::credentials() const -> const couchbase::core::cluster_credentials&
547
+ couchbase::core::origin::credentials() const -> couchbase::core::cluster_credentials
494
548
  {
549
+ const std::shared_lock lock(credentials_mutex_);
495
550
  return credentials_;
496
551
  }
@@ -20,6 +20,7 @@
20
20
  #include "cluster_credentials.hxx"
21
21
  #include "cluster_options.hxx"
22
22
 
23
+ #include <shared_mutex>
23
24
  #include <string>
24
25
  #include <utility>
25
26
  #include <vector>
@@ -43,7 +44,7 @@ struct origin {
43
44
  origin() = default;
44
45
  ~origin() = default;
45
46
 
46
- origin(origin&& other) = default;
47
+ origin(origin&& other) noexcept;
47
48
  origin(const origin& other);
48
49
  origin(origin other, const topology::configuration& config);
49
50
  origin(cluster_credentials auth,
@@ -55,14 +56,15 @@ struct origin {
55
56
  const std::string& port,
56
57
  cluster_options options);
57
58
  origin(cluster_credentials auth, const utils::connection_string& connstr);
58
- auto operator=(origin&& other) -> origin& = default;
59
+ auto operator=(origin&& other) noexcept -> origin&;
59
60
  auto operator=(const origin& other) -> origin&;
60
61
 
61
62
  [[nodiscard]] auto connection_string() const -> const std::string&;
62
- [[nodiscard]] auto username() const -> const std::string&;
63
- [[nodiscard]] auto password() const -> const std::string&;
64
- [[nodiscard]] auto certificate_path() const -> const std::string&;
65
- [[nodiscard]] auto key_path() const -> const std::string&;
63
+ [[nodiscard]] auto username() const -> std::string;
64
+ [[nodiscard]] auto password() const -> std::string;
65
+ [[nodiscard]] auto certificate_path() const -> std::string;
66
+ [[nodiscard]] auto key_path() const -> std::string;
67
+ [[nodiscard]] auto jwt_token() const -> std::string;
66
68
 
67
69
  [[nodiscard]] auto get_hostnames() const -> std::vector<std::string>;
68
70
  [[nodiscard]] auto get_nodes() const -> std::vector<std::string>;
@@ -71,6 +73,8 @@ struct origin {
71
73
  void set_nodes(node_list nodes);
72
74
  void set_nodes_from_config(const topology::configuration& config);
73
75
 
76
+ void update_credentials(cluster_credentials auth);
77
+
74
78
  [[nodiscard]] auto next_address() -> std::pair<std::string, std::string>;
75
79
 
76
80
  [[nodiscard]] auto exhausted() const -> bool;
@@ -79,16 +83,17 @@ struct origin {
79
83
 
80
84
  [[nodiscard]] auto options() const -> const couchbase::core::cluster_options&;
81
85
  [[nodiscard]] auto options() -> couchbase::core::cluster_options&;
82
- [[nodiscard]] auto credentials() const -> const couchbase::core::cluster_credentials&;
86
+ [[nodiscard]] auto credentials() const -> couchbase::core::cluster_credentials;
83
87
  [[nodiscard]] auto to_json() const -> std::string;
84
88
 
85
89
  private:
86
90
  couchbase::core::cluster_options options_{};
87
- cluster_credentials credentials_{};
88
91
  node_list nodes_{};
89
92
  node_list::iterator next_node_{};
90
93
  bool exhausted_{ false };
91
94
  std::string connection_string_{};
95
+ cluster_credentials credentials_{};
96
+ mutable std::shared_mutex credentials_mutex_{};
92
97
  };
93
98
 
94
99
  } // namespace couchbase::core
@@ -0,0 +1,164 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2025 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "orphan_reporter.hxx"
19
+
20
+ #include <couchbase/build_info.hxx>
21
+
22
+ #include "logger/logger.hxx"
23
+ #include "utils/concurrent_fixed_priority_queue.hxx"
24
+ #include "utils/json.hxx"
25
+
26
+ #include <asio/steady_timer.hpp>
27
+ #include <tao/json/value.hpp>
28
+
29
+ namespace couchbase::core
30
+ {
31
+ auto
32
+ orphan_attributes::operator<(const orphan_attributes& other) const -> bool
33
+ {
34
+ return total_duration < other.total_duration;
35
+ }
36
+
37
+ auto
38
+ orphan_attributes::operator>(const orphan_attributes& other) const -> bool
39
+ {
40
+ return total_duration > other.total_duration;
41
+ }
42
+
43
+ auto
44
+ orphan_attributes::to_json() const -> tao::json::value
45
+ {
46
+ return tao::json::value{
47
+ { "total_duration_us", total_duration.count() },
48
+ { "last_server_duration_us", last_server_duration.count() },
49
+ { "total_server_duration_us", total_server_duration.count() },
50
+ { "operation_name", operation_name },
51
+ { "last_local_id", connection_id },
52
+ { "operation_id", operation_id },
53
+ { "last_local_socket", last_local_socket },
54
+ { "last_remote_socket", last_remote_socket },
55
+ };
56
+ }
57
+
58
+ class orphan_reporter_impl : public std::enable_shared_from_this<orphan_reporter_impl>
59
+ {
60
+ public:
61
+ orphan_reporter_impl(asio::io_context& ctx, const orphan_reporter_options& options)
62
+ : options_{ options }
63
+ , orphan_queue_{ options.sample_size }
64
+ , emit_timer_{ ctx }
65
+ {
66
+ }
67
+
68
+ void add_orphan(orphan_attributes&& orphan)
69
+ {
70
+ orphan_queue_.emplace(std::move(orphan));
71
+ }
72
+
73
+ void start()
74
+ {
75
+ rearm();
76
+ }
77
+
78
+ void stop()
79
+ {
80
+ emit_timer_.cancel();
81
+ }
82
+
83
+ auto flush_and_create_output() -> std::optional<std::string>
84
+ {
85
+ if (orphan_queue_.empty()) {
86
+ return std::nullopt;
87
+ }
88
+
89
+ auto [queue, dropped_count] = orphan_queue_.steal_data();
90
+
91
+ auto total_count = queue.size() + dropped_count;
92
+
93
+ // We only do orphan reporting for KV at the moment. If we extend this to HTTP services, we must
94
+ // update this to handle other types of services as well.
95
+ tao::json::value report{
96
+ #if COUCHBASE_CXX_CLIENT_DEBUG_BUILD
97
+ { "emit_interval_ms", options_.emit_interval.count() },
98
+ { "sample_size", options_.sample_size },
99
+ #endif
100
+ { "kv", tao::json::value{ { "total_count", total_count } } },
101
+ };
102
+
103
+ tao::json::value entries = tao::json::empty_array;
104
+ while (!queue.empty()) {
105
+ entries.emplace_back(queue.top().to_json());
106
+ queue.pop();
107
+ }
108
+ report["kv"]["top_requests"] = entries;
109
+
110
+ return utils::json::generate(report);
111
+ }
112
+
113
+ private:
114
+ void rearm()
115
+ {
116
+ emit_timer_.expires_after(options_.emit_interval);
117
+ emit_timer_.async_wait([self = shared_from_this()](std::error_code ec) -> void {
118
+ if (ec == asio::error::operation_aborted) {
119
+ return;
120
+ }
121
+
122
+ if (auto report = self->flush_and_create_output(); report.has_value()) {
123
+ CB_LOG_WARNING("Orphan responses observed: {}", report.value());
124
+ }
125
+
126
+ self->rearm();
127
+ });
128
+ }
129
+
130
+ orphan_reporter_options options_;
131
+ utils::concurrent_fixed_priority_queue<orphan_attributes> orphan_queue_;
132
+ asio::steady_timer emit_timer_;
133
+ };
134
+
135
+ orphan_reporter::orphan_reporter(asio::io_context& ctx, const orphan_reporter_options& options)
136
+ : impl_{ std::make_shared<orphan_reporter_impl>(ctx, options) }
137
+ {
138
+ }
139
+
140
+ void
141
+ orphan_reporter::add_orphan(orphan_attributes&& orphan)
142
+ {
143
+ impl_->add_orphan(std::move(orphan));
144
+ }
145
+
146
+ void
147
+ orphan_reporter::start()
148
+ {
149
+ impl_->start();
150
+ }
151
+
152
+ void
153
+ orphan_reporter::stop()
154
+ {
155
+ impl_->stop();
156
+ }
157
+
158
+ auto
159
+ orphan_reporter::flush_and_create_output() -> std::optional<std::string>
160
+ {
161
+ return impl_->flush_and_create_output();
162
+ }
163
+
164
+ } // namespace couchbase::core
@@ -0,0 +1,65 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2025 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include "core/protocol/client_opcode.hxx"
21
+
22
+ #include <asio/io_context.hpp>
23
+ #include <tao/json/value.hpp>
24
+
25
+ #include <chrono>
26
+ #include <memory>
27
+
28
+ namespace couchbase::core
29
+ {
30
+ struct orphan_reporter_options {
31
+ std::chrono::milliseconds emit_interval{ std::chrono::seconds{ 10 } };
32
+ std::size_t sample_size{ 64 };
33
+ };
34
+
35
+ struct orphan_attributes {
36
+ std::string connection_id;
37
+ std::string operation_id;
38
+ std::string last_remote_socket;
39
+ std::string last_local_socket;
40
+ std::chrono::microseconds total_duration;
41
+ std::chrono::microseconds last_server_duration{ 0 };
42
+ std::chrono::microseconds total_server_duration{ 0 };
43
+ std::string operation_name;
44
+
45
+ auto operator<(const orphan_attributes& other) const -> bool;
46
+ auto operator>(const orphan_attributes& other) const -> bool;
47
+ auto to_json() const -> tao::json::value;
48
+ };
49
+
50
+ class orphan_reporter_impl;
51
+
52
+ class orphan_reporter
53
+ {
54
+ public:
55
+ orphan_reporter(asio::io_context& ctx, const orphan_reporter_options& options);
56
+
57
+ void add_orphan(orphan_attributes&& orphan);
58
+ void start();
59
+ void stop();
60
+ auto flush_and_create_output() -> std::optional<std::string>;
61
+
62
+ private:
63
+ std::shared_ptr<orphan_reporter_impl> impl_;
64
+ };
65
+ } // namespace couchbase::core
@@ -3,6 +3,7 @@ add_library(
3
3
  client.cc
4
4
  context.cc
5
5
  mechanism.cc
6
+ oauthbearer/oauthbearer.cc
6
7
  plain/plain.cc
7
8
  scram-sha/scram-sha.cc
8
9
  scram-sha/stringutils.cc)
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include "client.h"
19
19
 
20
+ #include "core/sasl/oauthbearer/oauthbearer.h"
20
21
  #include "core/sasl/plain/plain.h"
21
22
  #include "core/sasl/scram-sha/scram-sha.h"
22
23
 
@@ -43,6 +44,11 @@ ClientContext::ClientContext(GetUsernameCallback user_cb,
43
44
  break;
44
45
  case Mechanism::PLAIN:
45
46
  backend = std::make_unique<mechanism::plain::ClientBackend>(user_cb, password_cb, *this);
47
+ break;
48
+ case Mechanism::OAUTHBEARER:
49
+ backend =
50
+ std::make_unique<mechanism::oauthbearer::ClientBackend>(user_cb, password_cb, *this);
51
+ break;
46
52
  }
47
53
 
48
54
  if (!backend) {
@@ -30,7 +30,8 @@ select_mechanism(const std::vector<std::string>& available_mechanisms) -> Mechan
30
30
  { std::string{ "SCRAM-SHA512" }, Mechanism::SCRAM_SHA512 },
31
31
  { std::string{ "SCRAM-SHA256" }, Mechanism::SCRAM_SHA256 },
32
32
  { std::string{ "SCRAM-SHA1" }, Mechanism::SCRAM_SHA1 },
33
- { std::string{ "PLAIN" }, Mechanism::PLAIN }
33
+ { std::string{ "PLAIN" }, Mechanism::PLAIN },
34
+ { std::string{ "OAUTHBEARER" }, Mechanism::OAUTHBEARER },
34
35
  };
35
36
 
36
37
  for (const auto& [name, code] : mechs) {
@@ -30,7 +30,8 @@ enum class Mechanism {
30
30
  SCRAM_SHA512,
31
31
  SCRAM_SHA256,
32
32
  SCRAM_SHA1,
33
- PLAIN
33
+ PLAIN,
34
+ OAUTHBEARER,
34
35
  };
35
36
 
36
37
  class unknown_mechanism : public std::invalid_argument
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Copyright 2018 Couchbase, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #include "oauthbearer.h"
18
+
19
+ #include <spdlog/fmt/bundled/core.h>
20
+
21
+ namespace couchbase::core::sasl::mechanism::oauthbearer
22
+ {
23
+ auto
24
+ ClientBackend::start() -> std::pair<error, std::string_view>
25
+ {
26
+ auto header = std::string{ "n,," };
27
+ header.push_back(0x01);
28
+ header.append(fmt::format("auth=Bearer {}", passwordCallback()));
29
+ header.push_back(0x01);
30
+ header.push_back(0x01);
31
+ client_message = header;
32
+ return { error::OK, client_message };
33
+ }
34
+
35
+ auto
36
+ ClientBackend::step(std::string_view /*input*/) -> std::pair<error, std::string_view>
37
+ {
38
+ throw std::logic_error("ClientBackend::step(): OAUTHBEARER auth should not call step");
39
+ }
40
+
41
+ } // namespace couchbase::core::sasl::mechanism::oauthbearer
@@ -0,0 +1,47 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2016 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ #pragma once
18
+
19
+ #include "core/sasl/client.h"
20
+
21
+ /// Extremely simple prototype of an OAUTHBEARER mechanism as
22
+ /// desceribed in https://datatracker.ietf.org/doc/html/rfc7628 and
23
+ /// https://datatracker.ietf.org/doc/html/rfc6750
24
+ namespace couchbase::core::sasl::mechanism::oauthbearer
25
+ {
26
+
27
+ class ClientBackend : public MechanismBackend
28
+ {
29
+ public:
30
+ ClientBackend(GetUsernameCallback& user_cb, GetPasswordCallback& password_cb, ClientContext& ctx)
31
+ : MechanismBackend(user_cb, password_cb, ctx)
32
+ {
33
+ }
34
+
35
+ [[nodiscard]] auto get_name() const -> std::string_view override
36
+ {
37
+ return "OAUTHBEARER";
38
+ }
39
+
40
+ auto start() -> std::pair<error, std::string_view> override;
41
+
42
+ auto step(std::string_view) -> std::pair<error, std::string_view> override;
43
+
44
+ private:
45
+ std::string client_message;
46
+ };
47
+ } // namespace couchbase::core::sasl::mechanism::oauthbearer
@@ -0,0 +1,44 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2022-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
6
+ * except in compliance with the License. You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software distributed under
11
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
+ * ANY KIND, either express or implied. See the License for the specific language governing
13
+ * permissions and limitations under the License.
14
+ */
15
+
16
+ #include "tls_context_provider.hxx"
17
+
18
+ #include <asio/ssl/context.hpp>
19
+
20
+ namespace couchbase::core
21
+ {
22
+
23
+ tls_context_provider::tls_context_provider()
24
+ : ctx_(std::make_shared<asio::ssl::context>(asio::ssl::context::tls_client))
25
+ {
26
+ }
27
+
28
+ tls_context_provider::tls_context_provider(std::shared_ptr<asio::ssl::context> ctx)
29
+ : ctx_(std::move(ctx))
30
+ {
31
+ }
32
+
33
+ auto
34
+ tls_context_provider::get_ctx() const -> std::shared_ptr<asio::ssl::context>
35
+ {
36
+ return std::atomic_load(&ctx_);
37
+ }
38
+
39
+ void
40
+ tls_context_provider::set_ctx(std::shared_ptr<asio::ssl::context> new_ctx)
41
+ {
42
+ std::atomic_store(&ctx_, std::move(new_ctx));
43
+ }
44
+ } // namespace couchbase::core