neo4j-ruby-driver 6.0.3.alpha.0 → 6.2.1.beta.2

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 (348) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +113 -411
  3. data/{ruby → lib}/neo4j/driver/access_mode.rb +2 -1
  4. data/lib/neo4j/driver/auth_token_managers.rb +31 -0
  5. data/lib/neo4j/driver/auth_tokens.rb +41 -0
  6. data/lib/neo4j/driver/auto_commit_retries_mode.rb +18 -0
  7. data/lib/neo4j/driver/bolt/bolt_version.rb +67 -0
  8. data/lib/neo4j/driver/bolt/connection.rb +1091 -0
  9. data/lib/neo4j/driver/bolt/handshake.rb +236 -0
  10. data/lib/neo4j/driver/bolt/message/failure.rb +139 -0
  11. data/lib/neo4j/driver/bolt/message/ignored.rb +27 -0
  12. data/lib/neo4j/driver/bolt/message/record.rb +30 -0
  13. data/lib/neo4j/driver/bolt/message/success.rb +34 -0
  14. data/lib/neo4j/driver/bolt/message.rb +112 -0
  15. data/lib/neo4j/driver/bolt/pool.rb +255 -0
  16. data/lib/neo4j/driver/bolt/protocol/base.rb +146 -0
  17. data/lib/neo4j/driver/bolt/protocol/v3.rb +43 -0
  18. data/lib/neo4j/driver/bolt/protocol/v4.rb +24 -0
  19. data/lib/neo4j/driver/bolt/protocol/v43.rb +28 -0
  20. data/lib/neo4j/driver/bolt/protocol/v44.rb +23 -0
  21. data/lib/neo4j/driver/bolt/protocol/v5.rb +27 -0
  22. data/lib/neo4j/driver/bolt/protocol/v51.rb +24 -0
  23. data/lib/neo4j/driver/bolt/protocol/v52.rb +28 -0
  24. data/lib/neo4j/driver/bolt/protocol/v53.rb +27 -0
  25. data/lib/neo4j/driver/bolt/protocol/v54.rb +14 -0
  26. data/lib/neo4j/driver/bolt/protocol/v55.rb +17 -0
  27. data/lib/neo4j/driver/bolt/protocol/v56.rb +14 -0
  28. data/lib/neo4j/driver/bolt/protocol/v57.rb +31 -0
  29. data/lib/neo4j/driver/bolt/protocol/v58.rb +15 -0
  30. data/lib/neo4j/driver/bolt/protocol/v6.rb +43 -0
  31. data/lib/neo4j/driver/bolt/protocol/v61.rb +21 -0
  32. data/lib/neo4j/driver/bolt/protocol_version_handler.rb +39 -0
  33. data/lib/neo4j/driver/bolt/record_buffer.rb +143 -0
  34. data/lib/neo4j/driver/bolt/stream_handler.rb +53 -0
  35. data/lib/neo4j/driver/bolt/tls_config.rb +129 -0
  36. data/lib/neo4j/driver/bolt/wire.rb +321 -0
  37. data/lib/neo4j/driver/bookmark.rb +15 -0
  38. data/lib/neo4j/driver/bookmark_managers.rb +39 -0
  39. data/lib/neo4j/driver/client_certificate.rb +19 -0
  40. data/lib/neo4j/driver/client_certificate_manager.rb +37 -0
  41. data/lib/neo4j/driver/client_certificate_managers.rb +15 -0
  42. data/lib/neo4j/driver/client_certificates.rb +14 -0
  43. data/lib/neo4j/driver/direct/connection_provider.rb +262 -0
  44. data/lib/neo4j/driver/driver.rb +268 -0
  45. data/lib/neo4j/driver/eager_result.rb +10 -0
  46. data/lib/neo4j/driver/exceptions/neo4j_exception.rb +16 -7
  47. data/lib/neo4j/driver/exceptions/no_such_record_exception.rb +1 -1
  48. data/lib/neo4j/driver/exceptions/protocol_exception.rb +0 -5
  49. data/lib/neo4j/driver/exceptions/security_retryable_exception.rb +14 -0
  50. data/lib/neo4j/driver/exceptions/transaction_terminated_exception.rb +13 -0
  51. data/lib/neo4j/driver/graph_database.rb +29 -0
  52. data/lib/neo4j/driver/internal/clock.rb +20 -0
  53. data/lib/neo4j/driver/internal/clock_adapter.rb +21 -0
  54. data/lib/neo4j/driver/internal/default_bookmark_manager.rb +54 -0
  55. data/lib/neo4j/driver/internal/deprecator.rb +9 -5
  56. data/lib/neo4j/driver/internal/driver_factory.rb +128 -0
  57. data/lib/neo4j/driver/internal/duration_normalizer.rb +14 -39
  58. data/lib/neo4j/driver/internal/extras.rb +23 -0
  59. data/lib/neo4j/driver/internal/home_db_cache.rb +57 -0
  60. data/lib/neo4j/driver/internal/internal_auth_token_manager.rb +37 -0
  61. data/lib/neo4j/driver/internal/metrics.rb +31 -0
  62. data/lib/neo4j/driver/internal/security/static_auth_token_manager.rb +25 -0
  63. data/lib/neo4j/driver/internal/validator.rb +16 -2
  64. data/lib/neo4j/driver/net.rb +29 -0
  65. data/lib/neo4j/driver/packstream/markers.rb +49 -0
  66. data/lib/neo4j/driver/packstream/packer.rb +335 -0
  67. data/lib/neo4j/driver/packstream/structure.rb +27 -0
  68. data/lib/neo4j/driver/packstream/unpacker.rb +170 -0
  69. data/lib/neo4j/driver/record.rb +43 -0
  70. data/lib/neo4j/driver/result.rb +282 -0
  71. data/lib/neo4j/driver/routing/load_balancer.rb +706 -0
  72. data/lib/neo4j/driver/routing/routed_connection.rb +132 -0
  73. data/lib/neo4j/driver/routing/routing_table.rb +127 -0
  74. data/lib/neo4j/driver/routing/server_address.rb +25 -0
  75. data/lib/neo4j/driver/routing_control.rb +13 -0
  76. data/lib/neo4j/driver/session.rb +577 -0
  77. data/lib/neo4j/driver/summary/database_info.rb +25 -0
  78. data/lib/neo4j/driver/summary/gql_notification.rb +38 -0
  79. data/lib/neo4j/driver/summary/gql_status_object.rb +35 -0
  80. data/lib/neo4j/driver/summary/notification.rb +46 -0
  81. data/lib/neo4j/driver/summary/plan.rb +23 -0
  82. data/lib/neo4j/driver/summary/profile.rb +28 -0
  83. data/lib/neo4j/driver/summary/query.rb +19 -0
  84. data/lib/neo4j/driver/summary/query_type.rb +5 -1
  85. data/lib/neo4j/driver/summary/result_summary.rb +215 -0
  86. data/lib/neo4j/driver/summary/server_info.rb +33 -0
  87. data/lib/neo4j/driver/summary/summary_counters.rb +72 -0
  88. data/lib/neo4j/driver/transaction.rb +344 -0
  89. data/lib/neo4j/driver/types/duration.rb +76 -0
  90. data/lib/neo4j/driver/types/entity.rb +40 -0
  91. data/lib/neo4j/driver/types/local_date_time.rb +77 -8
  92. data/lib/neo4j/driver/types/local_time.rb +50 -7
  93. data/lib/neo4j/driver/types/node.rb +18 -0
  94. data/lib/neo4j/driver/types/offset_time.rb +78 -7
  95. data/lib/neo4j/driver/types/path.rb +68 -0
  96. data/lib/neo4j/driver/types/point.rb +38 -18
  97. data/lib/neo4j/driver/types/relationship.rb +32 -0
  98. data/lib/neo4j/driver/types/temporal_value.rb +44 -0
  99. data/lib/neo4j/driver/types/unbound_relationship.rb +24 -0
  100. data/lib/neo4j/driver/types/unresolvable_zoned_date_time.rb +38 -0
  101. data/lib/neo4j/driver/types/unsupported_type.rb +25 -0
  102. data/lib/neo4j/driver/types/uuid.rb +29 -0
  103. data/{ruby → lib}/neo4j/driver/version.rb +1 -1
  104. data/lib/neo4j/driver.rb +15 -0
  105. data/lib/neo4j-ruby-driver_loader.rb +34 -20
  106. metadata +115 -441
  107. data/lib/neo4j/driver/internal/bolt_server_address.rb +0 -97
  108. data/lib/neo4j/driver/synchronizable.rb +0 -23
  109. data/lib/neo4j/driver/types/time.rb +0 -45
  110. data/ruby/neo4j/driver/auth_tokens.rb +0 -34
  111. data/ruby/neo4j/driver/bookmark.rb +0 -21
  112. data/ruby/neo4j/driver/config.rb +0 -89
  113. data/ruby/neo4j/driver/graph_database.rb +0 -78
  114. data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +0 -51
  115. data/ruby/neo4j/driver/internal/async/connection/bootstrap_factory.rb +0 -22
  116. data/ruby/neo4j/driver/internal/async/connection/channel_attributes.rb +0 -31
  117. data/ruby/neo4j/driver/internal/async/connection/channel_connected_listener.rb +0 -32
  118. data/ruby/neo4j/driver/internal/async/connection/channel_connector_impl.rb +0 -83
  119. data/ruby/neo4j/driver/internal/async/connection/channel_pipeline_builder_impl.rb +0 -22
  120. data/ruby/neo4j/driver/internal/async/connection/direct_connection.rb +0 -30
  121. data/ruby/neo4j/driver/internal/async/connection/event_loop_group_factory.rb +0 -83
  122. data/ruby/neo4j/driver/internal/async/connection/handshake_completed_listener.rb +0 -27
  123. data/ruby/neo4j/driver/internal/async/connection/handshake_handler.rb +0 -113
  124. data/ruby/neo4j/driver/internal/async/connection/netty_channel_initializer.rb +0 -57
  125. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver.rb +0 -26
  126. data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver_group.rb +0 -19
  127. data/ruby/neo4j/driver/internal/async/connection/routing_connection.rb +0 -36
  128. data/ruby/neo4j/driver/internal/async/connection/stream.rb +0 -12
  129. data/ruby/neo4j/driver/internal/async/connection/stream_reader.rb +0 -16
  130. data/ruby/neo4j/driver/internal/async/connection_context.rb +0 -10
  131. data/ruby/neo4j/driver/internal/async/immutable_connection_context.rb +0 -24
  132. data/ruby/neo4j/driver/internal/async/inbound/byte_buf_input.rb +0 -30
  133. data/ruby/neo4j/driver/internal/async/inbound/channel_error_handler.rb +0 -77
  134. data/ruby/neo4j/driver/internal/async/inbound/chunk_decoder.rb +0 -41
  135. data/ruby/neo4j/driver/internal/async/inbound/connect_timeout_handler.rb +0 -32
  136. data/ruby/neo4j/driver/internal/async/inbound/connection_read_timeout_handler.rb +0 -17
  137. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +0 -171
  138. data/ruby/neo4j/driver/internal/async/inbound/inbound_message_handler.rb +0 -42
  139. data/ruby/neo4j/driver/internal/async/inbound/message_decoder.rb +0 -51
  140. data/ruby/neo4j/driver/internal/async/internal_async_session.rb +0 -92
  141. data/ruby/neo4j/driver/internal/async/internal_async_transaction.rb +0 -13
  142. data/ruby/neo4j/driver/internal/async/leak_logging_network_session.rb +0 -34
  143. data/ruby/neo4j/driver/internal/async/network_connection.rb +0 -194
  144. data/ruby/neo4j/driver/internal/async/network_session.rb +0 -150
  145. data/ruby/neo4j/driver/internal/async/outbound/chunk_aware_byte_buf_output.rb +0 -110
  146. data/ruby/neo4j/driver/internal/async/outbound/outbound_message_handler.rb +0 -39
  147. data/ruby/neo4j/driver/internal/async/pool/channel.rb +0 -66
  148. data/ruby/neo4j/driver/internal/async/pool/channel_pool.rb +0 -31
  149. data/ruby/neo4j/driver/internal/async/pool/channel_tracker.rb +0 -135
  150. data/ruby/neo4j/driver/internal/async/pool/connection_pool_impl.rb +0 -156
  151. data/ruby/neo4j/driver/internal/async/pool/netty_channel_health_checker.rb +0 -87
  152. data/ruby/neo4j/driver/internal/async/pool/netty_channel_pool.rb +0 -52
  153. data/ruby/neo4j/driver/internal/async/pool/network_connection_factory.rb +0 -21
  154. data/ruby/neo4j/driver/internal/async/pool/pool_settings.rb +0 -34
  155. data/ruby/neo4j/driver/internal/async/pool/timed_stack.rb +0 -15
  156. data/ruby/neo4j/driver/internal/async/result_cursors_holder.rb +0 -17
  157. data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +0 -212
  158. data/ruby/neo4j/driver/internal/bookmark_holder.rb +0 -9
  159. data/ruby/neo4j/driver/internal/cluster/cluster_composition.rb +0 -48
  160. data/ruby/neo4j/driver/internal/cluster/cluster_composition_lookup_result.rb +0 -14
  161. data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +0 -122
  162. data/ruby/neo4j/driver/internal/cluster/identity_resolver.rb +0 -10
  163. data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb +0 -68
  164. data/ruby/neo4j/driver/internal/cluster/loadbalancing/load_balancer.rb +0 -125
  165. data/ruby/neo4j/driver/internal/cluster/loadbalancing/round_robin_array_index.rb +0 -13
  166. data/ruby/neo4j/driver/internal/cluster/multi_databases_routing_procedure_runner.rb +0 -31
  167. data/ruby/neo4j/driver/internal/cluster/rediscovery_impl.rb +0 -147
  168. data/ruby/neo4j/driver/internal/cluster/route_message_routing_procedure_runner.rb +0 -43
  169. data/ruby/neo4j/driver/internal/cluster/routing_context.rb +0 -77
  170. data/ruby/neo4j/driver/internal/cluster/routing_procedure_cluster_composition_provider.rb +0 -60
  171. data/ruby/neo4j/driver/internal/cluster/routing_procedure_response.rb +0 -35
  172. data/ruby/neo4j/driver/internal/cluster/routing_settings.rb +0 -24
  173. data/ruby/neo4j/driver/internal/cluster/routing_table_handler_impl.rb +0 -95
  174. data/ruby/neo4j/driver/internal/cluster/routing_table_registry_impl.rb +0 -121
  175. data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +0 -73
  176. data/ruby/neo4j/driver/internal/connection_settings.rb +0 -16
  177. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +0 -55
  178. data/ruby/neo4j/driver/internal/cursor/async_result_cursor_only_factory.rb +0 -24
  179. data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +0 -61
  180. data/ruby/neo4j/driver/internal/cursor/result_cursor_factory_impl.rb +0 -24
  181. data/ruby/neo4j/driver/internal/cursor/rx_result_cursor_impl.rb +0 -110
  182. data/ruby/neo4j/driver/internal/database_name_util.rb +0 -37
  183. data/ruby/neo4j/driver/internal/default_bookmark_holder.rb +0 -9
  184. data/ruby/neo4j/driver/internal/default_domain_name_resolver.rb +0 -11
  185. data/ruby/neo4j/driver/internal/direct_connection_provider.rb +0 -40
  186. data/ruby/neo4j/driver/internal/driver_factory.rb +0 -126
  187. data/ruby/neo4j/driver/internal/eager_result_value.rb +0 -5
  188. data/ruby/neo4j/driver/internal/handlers/begin_tx_response_handler.rb +0 -20
  189. data/ruby/neo4j/driver/internal/handlers/channel_releasing_reset_response_handler.rb +0 -30
  190. data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +0 -23
  191. data/ruby/neo4j/driver/internal/handlers/hello_response_handler.rb +0 -65
  192. data/ruby/neo4j/driver/internal/handlers/init_response_handler.rb +0 -34
  193. data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +0 -199
  194. data/ruby/neo4j/driver/internal/handlers/no_op_response_handler.rb +0 -16
  195. data/ruby/neo4j/driver/internal/handlers/ping_response_handler.rb +0 -29
  196. data/ruby/neo4j/driver/internal/handlers/pull_handlers.rb +0 -32
  197. data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +0 -169
  198. data/ruby/neo4j/driver/internal/handlers/pulln/basic_pull_response_handler.rb +0 -298
  199. data/ruby/neo4j/driver/internal/handlers/pulln/fetch_size_util.rb +0 -20
  200. data/ruby/neo4j/driver/internal/handlers/reset_response_handler.rb +0 -34
  201. data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +0 -25
  202. data/ruby/neo4j/driver/internal/handlers/route_message_response_handler.rb +0 -21
  203. data/ruby/neo4j/driver/internal/handlers/routing_response_handler.rb +0 -79
  204. data/ruby/neo4j/driver/internal/handlers/run_response_handler.rb +0 -38
  205. data/ruby/neo4j/driver/internal/handlers/session_pull_response_completion_listener.rb +0 -34
  206. data/ruby/neo4j/driver/internal/handlers/transaction_pull_response_completion_listener.rb +0 -20
  207. data/ruby/neo4j/driver/internal/impersonation_util.rb +0 -22
  208. data/ruby/neo4j/driver/internal/internal_bookmark.rb +0 -9
  209. data/ruby/neo4j/driver/internal/internal_database_name.rb +0 -9
  210. data/ruby/neo4j/driver/internal/internal_driver.rb +0 -83
  211. data/ruby/neo4j/driver/internal/internal_entity.rb +0 -21
  212. data/ruby/neo4j/driver/internal/internal_node.rb +0 -21
  213. data/ruby/neo4j/driver/internal/internal_pair.rb +0 -9
  214. data/ruby/neo4j/driver/internal/internal_path.rb +0 -35
  215. data/ruby/neo4j/driver/internal/internal_point2_d.rb +0 -9
  216. data/ruby/neo4j/driver/internal/internal_point3_d.rb +0 -6
  217. data/ruby/neo4j/driver/internal/internal_record.rb +0 -27
  218. data/ruby/neo4j/driver/internal/internal_relationship.rb +0 -27
  219. data/ruby/neo4j/driver/internal/internal_result.rb +0 -49
  220. data/ruby/neo4j/driver/internal/internal_session.rb +0 -91
  221. data/ruby/neo4j/driver/internal/internal_transaction.rb +0 -48
  222. data/ruby/neo4j/driver/internal/logging/channel_activity_logger.rb +0 -29
  223. data/ruby/neo4j/driver/internal/logging/channel_error_logger.rb +0 -17
  224. data/ruby/neo4j/driver/internal/logging/prefixed_logger.rb +0 -19
  225. data/ruby/neo4j/driver/internal/logging/reformatted_logger.rb +0 -17
  226. data/ruby/neo4j/driver/internal/messaging/abstract_message_writer.rb +0 -23
  227. data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +0 -32
  228. data/ruby/neo4j/driver/internal/messaging/bolt_protocol_version.rb +0 -48
  229. data/ruby/neo4j/driver/internal/messaging/common/common_message_reader.rb +0 -51
  230. data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +0 -33
  231. data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +0 -104
  232. data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +0 -256
  233. data/ruby/neo4j/driver/internal/messaging/encode/begin_message_encoder.rb +0 -15
  234. data/ruby/neo4j/driver/internal/messaging/encode/commit_message_encoder.rb +0 -14
  235. data/ruby/neo4j/driver/internal/messaging/encode/discard_all_message_encoder.rb +0 -14
  236. data/ruby/neo4j/driver/internal/messaging/encode/discard_message_encoder.rb +0 -15
  237. data/ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb +0 -14
  238. data/ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb +0 -15
  239. data/ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb +0 -16
  240. data/ruby/neo4j/driver/internal/messaging/encode/logoff_message_encoder.rb +0 -14
  241. data/ruby/neo4j/driver/internal/messaging/encode/logon_message_encoder.rb +0 -15
  242. data/ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb +0 -14
  243. data/ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb +0 -15
  244. data/ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb +0 -14
  245. data/ruby/neo4j/driver/internal/messaging/encode/rollback_message_encoder.rb +0 -14
  246. data/ruby/neo4j/driver/internal/messaging/encode/route_message_encoder.rb +0 -24
  247. data/ruby/neo4j/driver/internal/messaging/encode/route_v44_message_encoder.rb +0 -22
  248. data/ruby/neo4j/driver/internal/messaging/encode/run_message_encoder.rb +0 -16
  249. data/ruby/neo4j/driver/internal/messaging/encode/run_with_metadata_message_encoder.rb +0 -17
  250. data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +0 -25
  251. data/ruby/neo4j/driver/internal/messaging/request/begin_message.rb +0 -25
  252. data/ruby/neo4j/driver/internal/messaging/request/commit_message.rb +0 -20
  253. data/ruby/neo4j/driver/internal/messaging/request/discard_all_message.rb +0 -20
  254. data/ruby/neo4j/driver/internal/messaging/request/discard_message.rb +0 -23
  255. data/ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb +0 -20
  256. data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +0 -30
  257. data/ruby/neo4j/driver/internal/messaging/request/init_message.rb +0 -19
  258. data/ruby/neo4j/driver/internal/messaging/request/logoff_message.rb +0 -13
  259. data/ruby/neo4j/driver/internal/messaging/request/logon_message.rb +0 -13
  260. data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +0 -17
  261. data/ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb +0 -26
  262. data/ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb +0 -23
  263. data/ruby/neo4j/driver/internal/messaging/request/pull_message.rb +0 -22
  264. data/ruby/neo4j/driver/internal/messaging/request/reset_message.rb +0 -32
  265. data/ruby/neo4j/driver/internal/messaging/request/rollback_message.rb +0 -20
  266. data/ruby/neo4j/driver/internal/messaging/request/route_message.rb +0 -28
  267. data/ruby/neo4j/driver/internal/messaging/request/run_message.rb +0 -23
  268. data/ruby/neo4j/driver/internal/messaging/request/run_with_metadata_message.rb +0 -49
  269. data/ruby/neo4j/driver/internal/messaging/request/transaction_metadata_builder.rb +0 -24
  270. data/ruby/neo4j/driver/internal/messaging/response/failure_message.rb +0 -40
  271. data/ruby/neo4j/driver/internal/messaging/response/ignored_message.rb +0 -29
  272. data/ruby/neo4j/driver/internal/messaging/response/record_message.rb +0 -33
  273. data/ruby/neo4j/driver/internal/messaging/response/success_message.rb +0 -34
  274. data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +0 -82
  275. data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +0 -17
  276. data/ruby/neo4j/driver/internal/messaging/v3/message_writer_v3.rb +0 -27
  277. data/ruby/neo4j/driver/internal/messaging/v4/bolt_protocol_v4.rb +0 -29
  278. data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +0 -13
  279. data/ruby/neo4j/driver/internal/messaging/v4/message_writer_v4.rb +0 -17
  280. data/ruby/neo4j/driver/internal/messaging/v41/bolt_protocol_v41.rb +0 -25
  281. data/ruby/neo4j/driver/internal/messaging/v42/bolt_protocol_v42.rb +0 -13
  282. data/ruby/neo4j/driver/internal/messaging/v43/bolt_protocol_v43.rb +0 -19
  283. data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +0 -14
  284. data/ruby/neo4j/driver/internal/messaging/v43/message_writer_v43.rb +0 -20
  285. data/ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb +0 -17
  286. data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +0 -14
  287. data/ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb +0 -15
  288. data/ruby/neo4j/driver/internal/messaging/v5/bolt_protocol_v5.rb +0 -21
  289. data/ruby/neo4j/driver/internal/messaging/v5/message_format_v5.rb +0 -18
  290. data/ruby/neo4j/driver/internal/messaging/v5/value_unpacker_v5.rb +0 -17
  291. data/ruby/neo4j/driver/internal/messaging/v51/bolt_protocol_v51.rb +0 -40
  292. data/ruby/neo4j/driver/internal/messaging/v51/message_format_v51.rb +0 -14
  293. data/ruby/neo4j/driver/internal/messaging/v51/message_writer_v51.rb +0 -17
  294. data/ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb +0 -34
  295. data/ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb +0 -46
  296. data/ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb +0 -105
  297. data/ruby/neo4j/driver/internal/metrics/internal_metrics.rb +0 -82
  298. data/ruby/neo4j/driver/internal/metrics/internal_metrics_provider.rb +0 -18
  299. data/ruby/neo4j/driver/internal/metrics/listener_event.rb +0 -17
  300. data/ruby/neo4j/driver/internal/metrics/metrics_provider.rb +0 -24
  301. data/ruby/neo4j/driver/internal/metrics/time_recorder_listener_event.rb +0 -15
  302. data/ruby/neo4j/driver/internal/packstream/byte_array_incompatible_packer.rb +0 -12
  303. data/ruby/neo4j/driver/internal/packstream/pack_input.rb +0 -47
  304. data/ruby/neo4j/driver/internal/packstream/pack_output.rb +0 -39
  305. data/ruby/neo4j/driver/internal/packstream/pack_stream.rb +0 -324
  306. data/ruby/neo4j/driver/internal/packstream/pack_type.rb +0 -17
  307. data/ruby/neo4j/driver/internal/read_only_bookmark_holder.rb +0 -13
  308. data/ruby/neo4j/driver/internal/resolved_bolt_server_address.rb +0 -35
  309. data/ruby/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +0 -150
  310. data/ruby/neo4j/driver/internal/revocation_strategy.rb +0 -19
  311. data/ruby/neo4j/driver/internal/scheme.rb +0 -32
  312. data/ruby/neo4j/driver/internal/security/internal_auth_token.rb +0 -15
  313. data/ruby/neo4j/driver/internal/security/security_plan_impl.rb +0 -48
  314. data/ruby/neo4j/driver/internal/security_setting.rb +0 -66
  315. data/ruby/neo4j/driver/internal/session_factory_impl.rb +0 -32
  316. data/ruby/neo4j/driver/internal/spi/connection.rb +0 -19
  317. data/ruby/neo4j/driver/internal/spi/connection_pool.rb +0 -9
  318. data/ruby/neo4j/driver/internal/spi/response_handler.rb +0 -23
  319. data/ruby/neo4j/driver/internal/summary/internal_database_info.rb +0 -7
  320. data/ruby/neo4j/driver/internal/summary/internal_input_position.rb +0 -11
  321. data/ruby/neo4j/driver/internal/summary/internal_notification.rb +0 -16
  322. data/ruby/neo4j/driver/internal/summary/internal_plan.rb +0 -41
  323. data/ruby/neo4j/driver/internal/summary/internal_profiled_plan.rb +0 -32
  324. data/ruby/neo4j/driver/internal/summary/internal_result_summary.rb +0 -33
  325. data/ruby/neo4j/driver/internal/summary/internal_server_info.rb +0 -6
  326. data/ruby/neo4j/driver/internal/summary/internal_summary_counters.rb +0 -18
  327. data/ruby/neo4j/driver/internal/svm/netty_substitutions.rb +0 -196
  328. data/ruby/neo4j/driver/internal/svm/z_lib_substitutions.rb +0 -21
  329. data/ruby/neo4j/driver/internal/util/certificate_tool.rb +0 -65
  330. data/ruby/neo4j/driver/internal/util/clock.rb +0 -29
  331. data/ruby/neo4j/driver/internal/util/error_util.rb +0 -104
  332. data/ruby/neo4j/driver/internal/util/extract.rb +0 -123
  333. data/ruby/neo4j/driver/internal/util/format.rb +0 -39
  334. data/ruby/neo4j/driver/internal/util/futures.rb +0 -99
  335. data/ruby/neo4j/driver/internal/util/iterables.rb +0 -35
  336. data/ruby/neo4j/driver/internal/util/lock_util.rb +0 -23
  337. data/ruby/neo4j/driver/internal/util/metadata_extractor.rb +0 -101
  338. data/ruby/neo4j/driver/internal/util/mutex.rb +0 -9
  339. data/ruby/neo4j/driver/internal/util/preconditions.rb +0 -16
  340. data/ruby/neo4j/driver/internal/util/result_holder.rb +0 -72
  341. data/ruby/neo4j/driver/internal/util/server_version.rb +0 -60
  342. data/ruby/neo4j/driver/logging1.rb +0 -51
  343. data/ruby/neo4j/driver/net/server_address.rb +0 -9
  344. data/ruby/neo4j/driver/query.rb +0 -48
  345. data/ruby/neo4j/driver/records.rb +0 -13
  346. data/ruby/neo4j/driver/transaction_config.rb +0 -50
  347. data/ruby/neo4j/driver/values.rb +0 -26
  348. data/ruby/neo4j/driver.rb +0 -30
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ # Adapts a `#now_millis` time source (epoch milliseconds) to the driver's
7
+ # monotonic/realtime Clock interface. The MRI counterpart of the jruby
8
+ # `ClockAdapter` that bridges `#now_millis` into a `java.time.Clock`;
9
+ # `DriverFactory#to_clock` wraps testkit-backend's clock in it so the
10
+ # driver internals consume it like any other Clock.
11
+ class ClockAdapter
12
+ def initialize(source)
13
+ @source = source
14
+ end
15
+
16
+ def monotonic = @source.now_millis / 1000.0
17
+ def realtime = ::Time.at(@source.now_millis / 1000.0)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ # Thread-safe in-memory implementation behind
7
+ # `BookmarkManagers.default_manager`. Internal because callers
8
+ # code against the duck type (`bookmarks` + `update_bookmarks`)
9
+ # and shouldn't depend on this class name.
10
+ #
11
+ # `bookmarks_supplier` runs on every `bookmarks` call so external
12
+ # state (e.g. bookmarks persisted by another node in a cluster of
13
+ # app servers) is folded into what we send on BEGIN.
14
+ # `bookmarks_consumer` runs on every successful `update_bookmarks`
15
+ # so external listeners can react.
16
+ class DefaultBookmarkManager
17
+ def initialize(initial_bookmarks: nil, bookmarks_supplier: nil, bookmarks_consumer: nil)
18
+ @bookmarks = normalize(initial_bookmarks)
19
+ @supplier = bookmarks_supplier
20
+ @consumer = bookmarks_consumer
21
+ @lock = Mutex.new
22
+ end
23
+
24
+ def bookmarks
25
+ @lock.synchronize { @bookmarks.dup } | normalize(@supplier&.call)
26
+ end
27
+
28
+ # Java's BookmarkManagerImpl semantics: drop everything in
29
+ # `previous` (set-difference is a no-op for entries we don't
30
+ # have, so callers can pass the full "what I sent on BEGIN"
31
+ # snapshot — including the session's own bookmarks — without
32
+ # special-casing), then add the new ones from the commit
33
+ # response. Consumer sees the post-update set.
34
+ def update_bookmarks(previous, new)
35
+ prev_set = normalize(previous)
36
+ new_set = normalize(new)
37
+ updated_snapshot = nil
38
+ @lock.synchronize do
39
+ @bookmarks -= prev_set
40
+ @bookmarks |= new_set
41
+ updated_snapshot = @bookmarks.dup
42
+ end
43
+ @consumer&.call(updated_snapshot)
44
+ end
45
+
46
+ private
47
+
48
+ def normalize(bookmarks)
49
+ Set.new(Array(bookmarks).map(&Bookmark.method(:from)))
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,13 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Neo4j
2
4
  module Driver
3
5
  module Internal
4
6
  module Deprecator
5
- def self.deprecator
6
- @deprecator ||= ActiveSupport::Deprecation.new('6.0', 'neo4j-ruby-driver')
7
- end
7
+ class << self
8
+ def deprecator
9
+ self
10
+ end
8
11
 
9
- def self.log_warning(old_method, new_method, version)
10
- deprecator.deprecation_warning(old_method, new_method)
12
+ def behavior=(value)
13
+ # No-op for now
14
+ end
11
15
  end
12
16
  end
13
17
  end
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ # MRI flavour of the impl-agnostic `Internal::DriverFactory`
7
+ # seam. Owns the actual driver-construction logic — URI
8
+ # validation + `Internal::Driver.new(...)` — so that
9
+ # `GraphDatabase.driver` is just the convenience entry point
10
+ # that wraps the user-supplied `AuthToken` in a
11
+ # `StaticAuthTokenManager` and calls us.
12
+ #
13
+ # The factory is also the single owner of the driver's non-public
14
+ # extension hooks: `getDomainNameResolver` (nil by default = system DNS)
15
+ # and `create_clock` (the real system clock by default). testkit's
16
+ # subclass overrides them. Rather than leaking these into the
17
+ # user-facing config, new_instance threads them as their own parameters
18
+ # into the ConnectionProvider it assembles, so the Driver and the
19
+ # user-facing `config` never carry them. `to_domain_name_resolver` is
20
+ # identity (MRI doesn't bridge resolver types); `to_clock` wraps a
21
+ # `#now_millis` source in Internal::ClockAdapter.
22
+ class DriverFactory
23
+ VALID_SCHEMES = %w[bolt bolt+s bolt+ssc neo4j neo4j+s neo4j+ssc].freeze
24
+
25
+ def to_domain_name_resolver(resolver_proc)
26
+ resolver_proc
27
+ end
28
+
29
+ # Wrap a `#now_millis` time source in the driver's Clock interface. The
30
+ # jruby flavour wraps it in a java.time.Clock adapter instead.
31
+ def to_clock(clock)
32
+ Internal::ClockAdapter.new(clock)
33
+ end
34
+
35
+ # camelCase to match the name Java's DriverFactory exposes and that
36
+ # subclasses (testkit's DriverFactoryWithDomainNameResolver) call
37
+ # `super` on. Default: no custom resolver (system DNS is used). The
38
+ # subclass returns its proc when one is registered, else falls through
39
+ # to this via `super`.
40
+ def getDomainNameResolver = nil
41
+
42
+ # The clock the driver's internals run on. Default is the real system
43
+ # clock; testkit's subclass overrides this (returning `to_clock` of its
44
+ # own time source) so its tests can freeze/advance time — the driver
45
+ # stays agnostic.
46
+ def create_clock = Internal::Clock.new
47
+
48
+ # Mutual-TLS client certificates (Feature:API:SSLClientCertificate): the
49
+ # ClientCertificateManager is threaded into the options every connection's
50
+ # TlsConfig reads, so each connection's SSL context presents the current
51
+ # (rotatable) client certificate. nil (the common case) leaves TLS
52
+ # unchanged.
53
+ def new_instance(uri, auth_token_manager, client_certificate_manager: nil, **config)
54
+ parsed_uri = validate_uri(uri)
55
+ validate_security_settings(parsed_uri.scheme, config)
56
+ config = config.merge(client_certificate_manager: client_certificate_manager) if client_certificate_manager
57
+ # The factory is the single place that knows about the non-public
58
+ # extension hooks (the domain-name resolver and the clock). It
59
+ # assembles a fully-wired ConnectionProvider with
60
+ # those baked in and hands it to the Driver, so the Driver and the
61
+ # user-facing `config` never carry these hooks.
62
+ #
63
+ # Retain the manager (not a frozen token): the provider consults it
64
+ # for the current token on every acquire and on security failures,
65
+ # so token refresh / re-auth works.
66
+ #
67
+ # The clock the internals run on (default real, testkit's own
68
+ # otherwise) is an internal extension hook like the domain-name
69
+ # resolver — threaded as its own parameter to the provider / pool /
70
+ # connection / routing / session, never mixed into the user-facing
71
+ # `config`.
72
+ clock = create_clock
73
+ provider = build_connection_provider(parsed_uri, auth_token_manager, config, clock)
74
+ Driver.new(uri, config, provider, clock: clock)
75
+ end
76
+
77
+ private
78
+
79
+ def build_connection_provider(uri, auth_manager, options, clock)
80
+ klass = uri.scheme.start_with?('neo4j') ? Routing::LoadBalancer : Direct::ConnectionProvider
81
+ klass.new(uri, auth_manager, options, domain_name_resolver: getDomainNameResolver, clock: clock)
82
+ end
83
+
84
+ def validate_uri(uri)
85
+ parsed = URI(uri)
86
+ raise ArgumentError, 'Scheme must not be null' if parsed.scheme.nil? || parsed.scheme.empty?
87
+ raise ArgumentError, "Unsupported URI scheme: #{parsed.scheme}" unless VALID_SCHEMES.include?(parsed.scheme)
88
+
89
+ # Routing context (URI query parameters, e.g. region/policy) only
90
+ # applies to routing drivers (neo4j://). A direct bolt:// driver
91
+ # would silently drop it — so reject it instead, matching Java's
92
+ # IllegalArgumentException. Server Side Routing is not enabled by
93
+ # passing a routing context to a direct connection.
94
+ if parsed.scheme.start_with?('bolt') && !parsed.query.to_s.empty?
95
+ raise ArgumentError,
96
+ "Routing parameters are not supported with scheme '#{parsed.scheme}'. Given URI: '#{uri}'"
97
+ end
98
+ parsed
99
+ rescue URI::InvalidURIError
100
+ raise ArgumentError, 'Scheme must not be null'
101
+ end
102
+
103
+ # A +s/+ssc scheme already fixes the security plan (encrypted, plus
104
+ # trust-all for +ssc). Combining it with *manually configured*
105
+ # encryption or trust settings is a conflict — mirror Java's
106
+ # SecuritySettings.assertSecuritySettingsNotUserConfigured and raise.
107
+ #
108
+ # Value equality (Detail:DefaultSecurityConfigValueEquality): a setting
109
+ # whose value equals the driver default (encryption off; trust = system
110
+ # certificates) is treated as *not* configured, so it is not a conflict.
111
+ # That is why `encryption: false` / no trust strategy on a +s scheme is
112
+ # accepted while `encryption: true` or an explicit trust strategy raises.
113
+ def validate_security_settings(scheme, config)
114
+ return unless Driver::ENCRYPTED_SCHEMES.include?(scheme)
115
+ return unless security_settings_customized?(config)
116
+
117
+ raise Exceptions::ClientException,
118
+ "Scheme #{scheme} is not configurable with manual encryption and trust settings"
119
+ end
120
+
121
+ def security_settings_customized?(config)
122
+ config[:encryption] == true ||
123
+ ![nil, :trust_system_certificates].include?(config.dig(:trust_strategy, :strategy))
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -4,47 +4,22 @@ module Neo4j
4
4
  module Driver
5
5
  module Internal
6
6
  module DurationNormalizer
7
- class << self
8
- def normalize(object)
9
- parts = object.parts.to_h
10
- parts.default = 0
11
- months_i, months_remainder_seconds = divmod(months(parts), ActiveSupport::Duration::SECONDS_PER_MONTH)
12
- months_days, months_remainder_seconds =
13
- months_remainder_seconds.divmod(ActiveSupport::Duration::SECONDS_PER_DAY)
14
- days_i, days_remainder_seconds = divmod(months_days + days(parts), ActiveSupport::Duration::SECONDS_PER_DAY)
15
- seconds_i, nonanoseconds = divmod(months_remainder_seconds + days_remainder_seconds + seconds(parts),
16
- 1_000_000_000)
17
- [months_i, days_i, seconds_i, nonanoseconds.round]
7
+ # Convert timeout from seconds (or ActiveSupport::Duration) to
8
+ # milliseconds for the Bolt protocol. A negative timeout is
9
+ # invalid — reject it client-side (matches Java, which raises
10
+ # rather than sending a negative tx_timeout to the server).
11
+ def timeout_to_milliseconds(timeout)
12
+ return if timeout.nil?
13
+
14
+ # Check the sign before rounding: a tiny negative timeout
15
+ # (e.g. -0.4ms) would otherwise round to 0 and slip through.
16
+ ms = timeout.to_f * 1000
17
+ if ms.negative?
18
+ raise Exceptions::ClientException,
19
+ "Transaction timeout must not be negative, but was #{ms}ms"
18
20
  end
19
21
 
20
- def milliseconds(duration)
21
- duration&.in_milliseconds&.round
22
- end
23
-
24
- def create(months, days, seconds, nanoseconds)
25
- { months:, days:, seconds: seconds + (nanoseconds.zero? ? 0 : nanoseconds * BigDecimal('1e-9')) }
26
- .sum { |key, value| ActiveSupport::Duration.send(key, value) }
27
- end
28
-
29
- private
30
-
31
- def divmod(number, factor)
32
- number_i, remainder = number.divmod(1)
33
- [number_i.to_i, remainder * factor]
34
- end
35
-
36
- def months(parts)
37
- parts[:years] * 12 + parts[:months]
38
- end
39
-
40
- def days(parts)
41
- parts[:weeks] * 7 + parts[:days]
42
- end
43
-
44
- def seconds(parts)
45
- parts[:hours] * ActiveSupport::Duration::SECONDS_PER_HOUR +
46
- parts[:minutes] * ActiveSupport::Duration::SECONDS_PER_MINUTE + parts[:seconds]
47
- end
22
+ ms.round
48
23
  end
49
24
  end
50
25
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ # Shared helpers for building Bolt protocol extras maps (RUN /
7
+ # BEGIN / etc). Kept tiny on purpose — we don't depend on
8
+ # ActiveSupport so this is the local replacement for
9
+ # `Hash#compact_blank!`.
10
+ module Extras
11
+ # Use as a Hash#reject! predicate to drop nil and
12
+ # empty-collection values:
13
+ #
14
+ # extras.reject!(&Internal::Extras::BLANK)
15
+ #
16
+ # Matches what other drivers serialise — testkit stub scripts
17
+ # strictly compare the map, so an empty `tx_metadata: {}` or
18
+ # an empty `bookmarks: []` left in the payload would mismatch.
19
+ BLANK = ->(_, v) { v.nil? || (v.respond_to?(:empty?) && v.empty?) }
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ # Driver-level cache mapping a user identity to their most recently
7
+ # resolved home database (Optimization:HomeDatabaseCache). It lets a routed
8
+ # session skip home-database discovery by optimistically guessing the
9
+ # cached database — safe only when every pooled connection advertised
10
+ # server-side routing (`ssr.enabled`), so the server transparently
11
+ # re-routes a wrong guess. Bounded, least-recently-used eviction.
12
+ class HomeDbCache
13
+ DEFAULT_MAX_SIZE = 10_000
14
+
15
+ def initialize(max_size: DEFAULT_MAX_SIZE)
16
+ @max_size = max_size
17
+ # Insertion order doubles as LRU recency: a Ruby Hash preserves it, so
18
+ # #get re-inserts the touched key at the end and #set evicts from the
19
+ # front once the cache is full.
20
+ @entries = {}
21
+ @mutex = Mutex.new
22
+ end
23
+
24
+ # The cache key for an identity: the impersonated user when set, else the
25
+ # per-session auth token (driver-level auth is nil, so every default-auth
26
+ # session shares one entry — the cache is bound to the identity, not the
27
+ # rotating token). Matches the Java driver: a basic-auth principal is NOT
28
+ # folded into the impersonated-user space
29
+ # (Optimization:HomeDbCacheBasicPrincipalIsImpersonatedUser stays off).
30
+ def compute_key(imp_user, auth) = imp_user || auth
31
+
32
+ # The cached database for this key, or nil on a miss. Touches recency.
33
+ def get(key)
34
+ @mutex.synchronize do
35
+ next nil unless @entries.key?(key)
36
+
37
+ database = @entries.delete(key)
38
+ @entries[key] = database
39
+ database
40
+ end
41
+ end
42
+
43
+ # Remember (or refresh) the resolved home database for this key. A nil
44
+ # database is ignored — there's nothing to guess next time.
45
+ def set(key, database)
46
+ return if database.nil?
47
+
48
+ @mutex.synchronize do
49
+ @entries.delete(key)
50
+ @entries[key] = database
51
+ @entries.shift while @entries.size > @max_size
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ # Auth-token manager: anything responding to
7
+ #
8
+ # get_token -> AuthToken
9
+ # handle_security_exception(token, exception) -> Boolean
10
+ #
11
+ # is a manager. Pass an instance to `GraphDatabase.driver` via the
12
+ # `:auth_token_manager` kw arg and the driver will call back into
13
+ # it when it needs a fresh token or when the server rejects the
14
+ # current one.
15
+ #
16
+ # This concrete class is the Proc-based shortcut — supply two
17
+ # callables and you're done. Clients that need richer behaviour
18
+ # subclass and override the methods; the JRuby flavour's class
19
+ # additionally implements `org.neo4j.driver.AuthTokenManager`, so
20
+ # subclasses there automatically slot into the Java driver.
21
+ class InternalAuthTokenManager
22
+ def initialize(get_token:, handle_security_exception:)
23
+ @get_token = get_token
24
+ @handle_security_exception = handle_security_exception
25
+ end
26
+
27
+ def get_token
28
+ @get_token.call
29
+ end
30
+
31
+ def handle_security_exception(token, exception)
32
+ @handle_security_exception.call(token, exception)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ # Driver metrics surface (testkit's `driver.metrics`). Today only the
7
+ # per-server connection-pool metrics are exposed — how many connections
8
+ # to each server address are in use vs. idle — which is what testkit's
9
+ # GetConnectionPoolMetrics / test_should_drop_connections_failing_
10
+ # liveness_check reads. The provider (Direct or Routing::LoadBalancer)
11
+ # owns the pools, so it produces the per-address snapshots.
12
+ class Metrics
13
+ # Per-server-address snapshot. `address` is a Routing::ServerAddress
14
+ # (responds to #host/#port so the testkit handler can match it). `#id`
15
+ # is the "host:port" string form, the forward-compatible duck-typed key
16
+ # DECISIONS.md (2026-06-05) describes for a future metrics contract.
17
+ ConnectionPoolMetrics = Struct.new(:address, :in_use, :idle) do
18
+ def id = address.to_s
19
+ end
20
+
21
+ def initialize(connection_provider)
22
+ @connection_provider = connection_provider
23
+ end
24
+
25
+ def connection_pool_metrics
26
+ @connection_provider.connection_pool_metrics
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Internal
6
+ module Security
7
+ # MRI counterpart to Java's
8
+ # `org.neo4j.driver.internal.security.StaticAuthTokenManager`.
9
+ # Returns the same `AuthToken` forever and never treats a
10
+ # security exception as retryable. Subclasses our
11
+ # duck-typed `Neo4j::Driver::AuthTokenManager` so the protocol
12
+ # — `get_token` / `handle_security_exception` — matches
13
+ # everything else MRI consumes.
14
+ class StaticAuthTokenManager < InternalAuthTokenManager
15
+ def initialize(token)
16
+ super(
17
+ get_token: -> { token },
18
+ handle_security_exception: ->(_, _) { false }
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -16,12 +16,26 @@ module Neo4j
16
16
 
17
17
  def self.require_non_nil!(obj, message = nil)
18
18
  raise ArgumentError, [message, "can't be nil"].compact.join(' ') if obj.nil?
19
+
19
20
  obj
20
21
  end
21
22
 
23
+ # Matches Java's driver-side query-text validation (the JRuby
24
+ # flavour gets this for free from the Java driver). A Query
25
+ # object carries its own text, so only bare strings are checked.
26
+ def self.require_query_text!(query)
27
+ raise ArgumentError, 'Cypher query text should not be null' if query.nil?
28
+ if query.is_a?(String) && query.strip.empty?
29
+ raise ArgumentError,
30
+ 'Cypher query text should not be an empty string'
31
+ end
32
+
33
+ query
34
+ end
35
+
22
36
  def self.require_non_nil_credentials!(username, password)
23
- require_non_nil! username, "Username"
24
- require_non_nil! password, "Password"
37
+ require_non_nil! username, 'Username'
38
+ require_non_nil! password, 'Password'
25
39
  end
26
40
  end
27
41
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ # Mirrors Java's org.neo4j.driver.net package — just enough to let
6
+ # cross-flavour callers (testkit-backend, user resolver code) build
7
+ # ServerAddress values without branching on flavour.
8
+ module Net
9
+ ServerAddress = Data.define(:host, :port) do
10
+ def self.of(host, port)
11
+ new(host, port)
12
+ end
13
+
14
+ # "host:port" (IPv6 hosts bracketed) — matches Java's
15
+ # ServerAddress.toString and Routing::ServerAddress#to_s. Without
16
+ # this, the default Data inspect (`#<data … host="h", port=N>`)
17
+ # leaks anywhere a caller stringifies the address: a custom
18
+ # resolver returns Net::ServerAddress values and
19
+ # Bolt::Connection#split_addr does `addr.to_s.rpartition(":")`,
20
+ # which then split on the `::` inside the class name and fed the
21
+ # tail to Integer() — the ArgumentError across the v4x4/v5x0
22
+ # resolver routing tests.
23
+ def to_s
24
+ host.include?(':') && !host.start_with?('[') ? "[#{host}]:#{port}" : "#{host}:#{port}"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module PackStream
6
+ # PackStream wire-format marker bytes.
7
+ # See https://neo4j.com/docs/bolt/current/packstream/ for the full table.
8
+ module Markers
9
+ TINY_STRING = 0x80
10
+ TINY_LIST = 0x90
11
+ TINY_MAP = 0xA0
12
+ TINY_STRUCT = 0xB0
13
+
14
+ NULL = 0xC0
15
+ FLOAT_64 = 0xC1
16
+ BOOLEAN_FALSE = 0xC2
17
+ BOOLEAN_TRUE = 0xC3
18
+
19
+ INT_8 = 0xC8
20
+ INT_16 = 0xC9
21
+ INT_32 = 0xCA
22
+ INT_64 = 0xCB
23
+
24
+ BYTES_8 = 0xCC
25
+ BYTES_16 = 0xCD
26
+ BYTES_32 = 0xCE
27
+
28
+ STRING_8 = 0xD0
29
+ STRING_16 = 0xD1
30
+ STRING_32 = 0xD2
31
+
32
+ LIST_8 = 0xD4
33
+ LIST_16 = 0xD5
34
+ LIST_32 = 0xD6
35
+
36
+ MAP_8 = 0xD8
37
+ MAP_16 = 0xD9
38
+ MAP_32 = 0xDA
39
+
40
+ STRUCT_8 = 0xDC
41
+ STRUCT_16 = 0xDD
42
+
43
+ # PackStream V2 (Bolt 6.1+): a UUID is a top-level value — the marker
44
+ # 0xE0 followed by the 16 raw bytes (big-endian) — not a struct.
45
+ UUID = 0xE0
46
+ end
47
+ end
48
+ end
49
+ end