pg_eventstore 1.13.4 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +11 -2
  3. data/CHANGELOG.md +195 -16
  4. data/README.md +33 -10
  5. data/db/migrations/10_setup_pg_cron.rb +1 -0
  6. data/db/migrations/11_add_events_link_global_position.sql +1 -0
  7. data/db/migrations/12_migrate_legacy_links.rb +83 -0
  8. data/db/migrations/13_remove_events_link_id.sql +6 -0
  9. data/db/migrations/14_remove_ids_events_id_index.sql +1 -0
  10. data/db/migrations/15_create_streams_global_index.sql +17 -0
  11. data/db/migrations/16_populate_streams_global_index.rb +150 -0
  12. data/db/migrations/17_create_events_global_index.sql +62 -0
  13. data/db/migrations/18_populate_events_global_index.rb +124 -0
  14. data/db/migrations/19_populate_events_global_index_p2.rb +25 -0
  15. data/db/migrations/20_migrate_subscriptions_current_position.sql +19 -0
  16. data/db/migrations/21_create_partitions_stats.sql +2 -0
  17. data/db/migrations/22_drop_streams_sql_view.sql +2 -0
  18. data/db/migrations/23_adjust_partitions_indexes.sql +5 -0
  19. data/db/migrations/24_drop_legacy_events_indexes.sql +3 -0
  20. data/db/migrations/25_add_parent_partitions_info_to_partitions.sql +16 -0
  21. data/db/migrations/26_change_events_stream_revision_type.rb +35 -0
  22. data/db/migrations/27_drop_events_horizon.sql +3 -0
  23. data/db/migrations/28_create_maintenance_tasks.sql +8 -0
  24. data/db/migrations/29_create_event_markers.sql +35 -0
  25. data/db/migrations/30_improve_partitions_search_in_admin_ui.rb +24 -0
  26. data/db/migrations/31_drop_events_id_default_value.sql +1 -0
  27. data/db/migrations/32_create_parittions_triggers.sql +101 -0
  28. data/db/migrations/9_create_events_horizon.sql +21 -0
  29. data/docs/AGENTS.fragment.md +696 -0
  30. data/docs/admin_ui.md +3 -1
  31. data/docs/appending_events.md +110 -49
  32. data/docs/configuration.md +69 -36
  33. data/docs/event_tracing.md +55 -0
  34. data/docs/events_and_streams.md +54 -30
  35. data/docs/how_it_works.md +57 -16
  36. data/docs/linking_events.md +2 -1
  37. data/docs/maintenance.md +14 -5
  38. data/docs/multiple_commands.md +30 -6
  39. data/docs/reading_events.md +208 -43
  40. data/docs/reading_streams.md +50 -0
  41. data/docs/replication.md +99 -0
  42. data/docs/subscriptions.md +165 -35
  43. data/docs/writing_middleware.md +25 -8
  44. data/ext/pg_eventstore_ext/extconf.rb +5 -0
  45. data/ext/pg_eventstore_ext/pg_eventstore_ext.c +74 -0
  46. data/lib/pg_eventstore/async_runner.rb +63 -0
  47. data/lib/pg_eventstore/basic_config.rb +15 -0
  48. data/lib/pg_eventstore/callbacks.rb +7 -5
  49. data/lib/pg_eventstore/chunks/chunk.rb +31 -0
  50. data/lib/pg_eventstore/chunks/read_api_events_index_chunk.rb +83 -0
  51. data/lib/pg_eventstore/chunks/replica_events_index_chunk.rb +35 -0
  52. data/lib/pg_eventstore/chunks/repository.rb +73 -0
  53. data/lib/pg_eventstore/chunks/subscription_checkpoint_chunk.rb +48 -0
  54. data/lib/pg_eventstore/chunks/subscription_events_index_chunk.rb +99 -0
  55. data/lib/pg_eventstore/chunks.rb +14 -0
  56. data/lib/pg_eventstore/cli/try_to_delete_subscriptions_set.rb +2 -2
  57. data/lib/pg_eventstore/client.rb +167 -52
  58. data/lib/pg_eventstore/commands/append.rb +62 -43
  59. data/lib/pg_eventstore/commands/delete_event.rb +7 -8
  60. data/lib/pg_eventstore/commands/delete_stream.rb +3 -3
  61. data/lib/pg_eventstore/commands/event_modifiers/prepare_link_event.rb +11 -6
  62. data/lib/pg_eventstore/commands/event_modifiers/prepare_regular_event.rb +12 -7
  63. data/lib/pg_eventstore/commands/link_to.rb +9 -9
  64. data/lib/pg_eventstore/commands/multiple.rb +2 -2
  65. data/lib/pg_eventstore/commands/read.rb +23 -5
  66. data/lib/pg_eventstore/commands/read_grouped.rb +46 -0
  67. data/lib/pg_eventstore/commands/read_streams.rb +18 -0
  68. data/lib/pg_eventstore/commands/read_streams_paginated.rb +56 -0
  69. data/lib/pg_eventstore/commands/regular_stream_read_paginated.rb +4 -4
  70. data/lib/pg_eventstore/commands/revision_check/current_revision.rb +51 -0
  71. data/lib/pg_eventstore/commands/revision_check/event_type_revisions_comparison.rb +46 -0
  72. data/lib/pg_eventstore/commands/revision_check/expected_revision.rb +135 -0
  73. data/lib/pg_eventstore/commands/revision_check/stream_revision_check.rb +98 -0
  74. data/lib/pg_eventstore/commands/revision_check/stream_revision_comparison.rb +36 -0
  75. data/lib/pg_eventstore/commands/stream_revision.rb +14 -0
  76. data/lib/pg_eventstore/commands/system_stream_read_paginated.rb +4 -4
  77. data/lib/pg_eventstore/commands.rb +4 -2
  78. data/lib/pg_eventstore/config.rb +30 -9
  79. data/lib/pg_eventstore/connection.rb +22 -37
  80. data/lib/pg_eventstore/errors.rb +137 -11
  81. data/lib/pg_eventstore/event.rb +39 -7
  82. data/lib/pg_eventstore/event_deserializer.rb +5 -4
  83. data/lib/pg_eventstore/event_global_index.rb +118 -0
  84. data/lib/pg_eventstore/event_marker.rb +16 -0
  85. data/lib/pg_eventstore/event_marker_index.rb +25 -0
  86. data/lib/pg_eventstore/event_serializer.rb +6 -0
  87. data/lib/pg_eventstore/extensions/acts_as_configurable.rb +88 -0
  88. data/lib/pg_eventstore/extensions/options_defaults.rb +25 -0
  89. data/lib/pg_eventstore/extensions/options_extension.rb +42 -13
  90. data/lib/pg_eventstore/feature_marker.rb +18 -0
  91. data/lib/pg_eventstore/maintenance.rb +11 -6
  92. data/lib/pg_eventstore/middleware/event_tracing.rb +53 -0
  93. data/lib/pg_eventstore/partition.rb +6 -0
  94. data/lib/pg_eventstore/pg_connection.rb +70 -14
  95. data/lib/pg_eventstore/queries/event_marker_queries.rb +74 -0
  96. data/lib/pg_eventstore/queries/event_queries.rb +9 -95
  97. data/lib/pg_eventstore/queries/events_global_index_queries.rb +131 -0
  98. data/lib/pg_eventstore/queries/index_filtering_queries.rb +179 -0
  99. data/lib/pg_eventstore/queries/links_resolver.rb +10 -7
  100. data/lib/pg_eventstore/queries/maintenance_queries.rb +159 -42
  101. data/lib/pg_eventstore/queries/partition_queries.rb +46 -104
  102. data/lib/pg_eventstore/queries/replica_queries.rb +110 -0
  103. data/lib/pg_eventstore/queries/streams_global_index_queries.rb +163 -0
  104. data/lib/pg_eventstore/queries/transaction_queries.rb +58 -10
  105. data/lib/pg_eventstore/queries.rb +29 -1
  106. data/lib/pg_eventstore/query_builders/basic_filtering.rb +38 -5
  107. data/lib/pg_eventstore/query_builders/event_markers_filtering.rb +47 -0
  108. data/lib/pg_eventstore/query_builders/event_markers_index_filtering.rb +275 -0
  109. data/lib/pg_eventstore/query_builders/event_subscription_positions_filtering.rb +37 -0
  110. data/lib/pg_eventstore/query_builders/events_filtering.rb +15 -164
  111. data/lib/pg_eventstore/query_builders/events_global_index_filtering.rb +227 -0
  112. data/lib/pg_eventstore/query_builders/filters/collection.rb +324 -0
  113. data/lib/pg_eventstore/query_builders/filters/event_type_filter.rb +37 -0
  114. data/lib/pg_eventstore/query_builders/filters/filter_row.rb +54 -0
  115. data/lib/pg_eventstore/query_builders/filters/marker_filter.rb +20 -0
  116. data/lib/pg_eventstore/query_builders/filters/marker_filter_row.rb +49 -0
  117. data/lib/pg_eventstore/query_builders/filters/stream_filter.rb +48 -0
  118. data/lib/pg_eventstore/query_builders/index_based_events_filtering.rb +260 -0
  119. data/lib/pg_eventstore/query_builders/partitions_filtering.rb +175 -51
  120. data/lib/pg_eventstore/query_builders/read_cursor/stream_cursor.rb +122 -0
  121. data/lib/pg_eventstore/query_builders/streams_global_index_filtering.rb +83 -0
  122. data/lib/pg_eventstore/query_builders/subscription_events_filtering.rb +79 -0
  123. data/lib/pg_eventstore/query_strategy/async.rb +64 -0
  124. data/lib/pg_eventstore/query_strategy/foreground.rb +25 -0
  125. data/lib/pg_eventstore/query_strategy.rb +19 -0
  126. data/lib/pg_eventstore/raw_event.rb +46 -0
  127. data/lib/pg_eventstore/rspec/test_helpers.rb +21 -8
  128. data/lib/pg_eventstore/sql_builder.rb +87 -8
  129. data/lib/pg_eventstore/stream.rb +14 -17
  130. data/lib/pg_eventstore/stream_global_index.rb +28 -0
  131. data/lib/pg_eventstore/subscriptions/basic_runner.rb +4 -4
  132. data/lib/pg_eventstore/subscriptions/callback_handlers/events_processor_handlers.rb +5 -17
  133. data/lib/pg_eventstore/subscriptions/callback_handlers/events_subscription_position_worker_handlers.rb +36 -0
  134. data/lib/pg_eventstore/subscriptions/callback_handlers/subscription_feeder_handlers.rb +13 -1
  135. data/lib/pg_eventstore/subscriptions/callback_handlers/subscription_runner_handlers.rb +19 -14
  136. data/lib/pg_eventstore/subscriptions/events_processor.rb +21 -19
  137. data/lib/pg_eventstore/subscriptions/events_processor_consumer/multiple.rb +63 -0
  138. data/lib/pg_eventstore/subscriptions/events_processor_consumer/replica.rb +68 -0
  139. data/lib/pg_eventstore/subscriptions/events_processor_consumer/single.rb +62 -0
  140. data/lib/pg_eventstore/subscriptions/events_processor_consumer.rb +44 -0
  141. data/lib/pg_eventstore/subscriptions/events_subscription_position_worker.rb +68 -0
  142. data/lib/pg_eventstore/subscriptions/queries/event_subscription_position_queries.rb +177 -0
  143. data/lib/pg_eventstore/subscriptions/queries/subscription_command_queries.rb +5 -5
  144. data/lib/pg_eventstore/subscriptions/queries/subscription_queries.rb +80 -56
  145. data/lib/pg_eventstore/subscriptions/queries/subscriptions_set_command_queries.rb +2 -2
  146. data/lib/pg_eventstore/subscriptions/queries/subscriptions_set_queries.rb +1 -1
  147. data/lib/pg_eventstore/subscriptions/replica_subscription_handler.rb +140 -0
  148. data/lib/pg_eventstore/subscriptions/replica_subscription_runner.rb +9 -0
  149. data/lib/pg_eventstore/subscriptions/subscription.rb +9 -7
  150. data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/collection.rb +36 -0
  151. data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/index_read_strategy.rb +82 -0
  152. data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/replication_strategy.rb +75 -0
  153. data/lib/pg_eventstore/subscriptions/subscription_feed_strategy.rb +31 -0
  154. data/lib/pg_eventstore/subscriptions/subscription_feeder.rb +26 -2
  155. data/lib/pg_eventstore/subscriptions/subscription_handler_performance.rb +5 -5
  156. data/lib/pg_eventstore/subscriptions/subscription_runner.rb +20 -22
  157. data/lib/pg_eventstore/subscriptions/subscription_runner_commands/reset_position.rb +1 -1
  158. data/lib/pg_eventstore/subscriptions/subscription_runners_feeder.rb +10 -11
  159. data/lib/pg_eventstore/subscriptions/subscriptions_lifecycle.rb +0 -12
  160. data/lib/pg_eventstore/subscriptions/subscriptions_manager.rb +84 -29
  161. data/lib/pg_eventstore/{subscriptions/synchronized_array.rb → synchronized_array.rb} +15 -0
  162. data/lib/pg_eventstore/tasks/setup.rake +32 -33
  163. data/lib/pg_eventstore/utils.rb +39 -0
  164. data/lib/pg_eventstore/version.rb +1 -1
  165. data/lib/pg_eventstore/web/application.rb +104 -20
  166. data/lib/pg_eventstore/web/paginator/base_collection.rb +5 -1
  167. data/lib/pg_eventstore/web/paginator/event_types_collection.rb +14 -4
  168. data/lib/pg_eventstore/web/paginator/events_collection.rb +29 -33
  169. data/lib/pg_eventstore/web/paginator/helpers.rb +19 -12
  170. data/lib/pg_eventstore/web/paginator/markers_collection.rb +48 -0
  171. data/lib/pg_eventstore/web/paginator/stream_contexts_collection.rb +13 -2
  172. data/lib/pg_eventstore/web/paginator/stream_ids_collection.rb +21 -11
  173. data/lib/pg_eventstore/web/paginator/stream_names_collection.rb +18 -4
  174. data/lib/pg_eventstore/web/paginator/streams_collection.rb +95 -0
  175. data/lib/pg_eventstore/web/public/javascripts/pg_eventstore.js +49 -22
  176. data/lib/pg_eventstore/web/subscriptions/helpers.rb +2 -2
  177. data/lib/pg_eventstore/web/subscriptions/set_collection.rb +1 -1
  178. data/lib/pg_eventstore/web/subscriptions/subscriptions.rb +1 -1
  179. data/lib/pg_eventstore/web/subscriptions/with_state/set_collection.rb +1 -1
  180. data/lib/pg_eventstore/web/subscriptions/with_state/subscriptions.rb +1 -1
  181. data/lib/pg_eventstore/web/views/home/dashboard.erb +11 -9
  182. data/lib/pg_eventstore/web/views/home/partials/event_filter.erb +18 -5
  183. data/lib/pg_eventstore/web/views/home/partials/events.erb +38 -1
  184. data/lib/pg_eventstore/web/views/home/partials/markers_filter.erb +18 -0
  185. data/lib/pg_eventstore/web/views/layouts/application.erb +6 -0
  186. data/lib/pg_eventstore/web/views/streams/index.erb +110 -0
  187. data/lib/pg_eventstore/web/views/streams/partials/streams.erb +11 -0
  188. data/lib/pg_eventstore/web/views/subscriptions/index.erb +4 -1
  189. data/lib/pg_eventstore/web.rb +2 -0
  190. data/lib/pg_eventstore.rb +26 -63
  191. data/pg_eventstore.gemspec +6 -4
  192. data/sig/interfaces/_raw_events_handler.rbs +3 -0
  193. data/sig/interfaces/subscription_handler.rbs +1 -1
  194. data/sig/pg/result.rbs +9 -0
  195. data/sig/pg_eventstore/async_runner.rbs +13 -0
  196. data/sig/pg_eventstore/basic_config.rbs +9 -0
  197. data/sig/pg_eventstore/chunks/chunk.rbs +13 -0
  198. data/sig/pg_eventstore/chunks/read_api_events_index_chunk.rbs +30 -0
  199. data/sig/pg_eventstore/chunks/replica_events_index_chunk.rbs +11 -0
  200. data/sig/pg_eventstore/chunks/repository.rbs +22 -0
  201. data/sig/pg_eventstore/chunks/subscription_checkpoint_chunk.rbs +18 -0
  202. data/sig/pg_eventstore/chunks/subscription_events_index_chunk.rbs +37 -0
  203. data/sig/pg_eventstore/client.rbs +41 -43
  204. data/sig/pg_eventstore/commands/append.rbs +11 -25
  205. data/sig/pg_eventstore/commands/event_modifiers/prepare_link_event.rbs +9 -12
  206. data/sig/pg_eventstore/commands/event_modifiers/prepare_regular_event.rbs +5 -4
  207. data/sig/pg_eventstore/commands/link_to.rbs +6 -11
  208. data/sig/pg_eventstore/commands/multiple.rbs +1 -1
  209. data/sig/pg_eventstore/commands/read.rbs +2 -5
  210. data/sig/pg_eventstore/commands/read_grouped.rbs +7 -0
  211. data/sig/pg_eventstore/commands/read_streams.rbs +7 -0
  212. data/sig/pg_eventstore/commands/read_streams_paginated.rbs +16 -0
  213. data/sig/pg_eventstore/commands/regular_stream_read_paginated.rbs +9 -17
  214. data/sig/pg_eventstore/commands/revision_check/current_revision.rbs +25 -0
  215. data/sig/pg_eventstore/commands/revision_check/event_type_revisions_comparison.rbs +14 -0
  216. data/sig/pg_eventstore/commands/revision_check/expected_revision.rbs +67 -0
  217. data/sig/pg_eventstore/commands/revision_check/stream_revision_check.rbs +20 -0
  218. data/sig/pg_eventstore/commands/revision_check/stream_revision_comparison.rbs +9 -0
  219. data/sig/pg_eventstore/commands/stream_revision.rbs +7 -0
  220. data/sig/pg_eventstore/commands/system_stream_read_paginated.rbs +9 -14
  221. data/sig/pg_eventstore/config.rbs +15 -6
  222. data/sig/pg_eventstore/connection.rbs +11 -18
  223. data/sig/pg_eventstore/errors.rbs +64 -34
  224. data/sig/pg_eventstore/event.rbs +20 -6
  225. data/sig/pg_eventstore/event_deserializer.rbs +5 -10
  226. data/sig/pg_eventstore/event_global_index.rbs +60 -0
  227. data/sig/pg_eventstore/event_marker.rbs +9 -0
  228. data/sig/pg_eventstore/event_marker_index.rbs +12 -0
  229. data/sig/pg_eventstore/extensions/acts_as_configurable.rbs +29 -0
  230. data/sig/pg_eventstore/extensions/options_defaults.rbs +7 -0
  231. data/sig/pg_eventstore/extensions/options_extension.rbs +9 -1
  232. data/sig/pg_eventstore/feature_marker.rbs +10 -0
  233. data/sig/pg_eventstore/maintenance.rbs +12 -8
  234. data/sig/pg_eventstore/middleware/event_trace.rbs +14 -0
  235. data/sig/pg_eventstore/partition.rbs +2 -4
  236. data/sig/pg_eventstore/pg_connection.rbs +8 -0
  237. data/sig/pg_eventstore/queries/event_marker_queries.rbs +21 -0
  238. data/sig/pg_eventstore/queries/event_queries.rbs +6 -38
  239. data/sig/pg_eventstore/queries/events_global_index_queries.rbs +37 -0
  240. data/sig/pg_eventstore/queries/index_filtering_queries.rbs +50 -0
  241. data/sig/pg_eventstore/queries/links_resolver.rbs +7 -11
  242. data/sig/pg_eventstore/queries/maintenance_queries.rbs +12 -9
  243. data/sig/pg_eventstore/queries/partition_queries.rbs +32 -67
  244. data/sig/pg_eventstore/queries/replica_queries.rbs +31 -0
  245. data/sig/pg_eventstore/queries/streams_global_index_queries.rbs +39 -0
  246. data/sig/pg_eventstore/queries/transaction_queries.rbs +4 -2
  247. data/sig/pg_eventstore/queries.rbs +11 -21
  248. data/sig/pg_eventstore/query_builders/basic_filtering.rbs +10 -3
  249. data/sig/pg_eventstore/query_builders/event_markers_filtering.rbs +17 -0
  250. data/sig/pg_eventstore/query_builders/event_markers_index_filtering.rbs +69 -0
  251. data/sig/pg_eventstore/query_builders/event_subscription_positions_filtering.rbs +15 -0
  252. data/sig/pg_eventstore/query_builders/events_filtering_query.rbs +9 -51
  253. data/sig/pg_eventstore/query_builders/events_global_index_filtering.rbs +68 -0
  254. data/sig/pg_eventstore/query_builders/filters/collection.rbs +84 -0
  255. data/sig/pg_eventstore/query_builders/filters/event_type_filter.rbs +19 -0
  256. data/sig/pg_eventstore/query_builders/filters/filter_row.rbs +21 -0
  257. data/sig/pg_eventstore/query_builders/filters/marker_filter.rbs +13 -0
  258. data/sig/pg_eventstore/query_builders/filters/marker_filter_row.rbs +19 -0
  259. data/sig/pg_eventstore/query_builders/filters/stream_filter.rbs +24 -0
  260. data/sig/pg_eventstore/query_builders/index_based_events_filtering.rbs +60 -0
  261. data/sig/pg_eventstore/query_builders/partitions_filtering.rbs +29 -10
  262. data/sig/pg_eventstore/query_builders/read_cursor/stream_cursor.rbs +47 -0
  263. data/sig/pg_eventstore/query_builders/streams_global_index_filtering.rbs +27 -0
  264. data/sig/pg_eventstore/query_builders/subscription_events_filtering.rbs +26 -0
  265. data/sig/pg_eventstore/query_strategy/async.rbs +17 -0
  266. data/sig/pg_eventstore/query_strategy/foreground.rbs +11 -0
  267. data/sig/pg_eventstore/query_strategy.rbs +7 -0
  268. data/sig/pg_eventstore/raw_event.rbs +20 -0
  269. data/sig/pg_eventstore/sql_builder.rbs +32 -10
  270. data/sig/pg_eventstore/stream.rbs +10 -18
  271. data/sig/pg_eventstore/stream_global_index.rbs +14 -0
  272. data/sig/pg_eventstore/subscriptions/callback_handlers/events_processor_handlers.rbs +5 -4
  273. data/sig/pg_eventstore/subscriptions/callback_handlers/events_subscription_position_worker_handlers.rbs +9 -0
  274. data/sig/pg_eventstore/subscriptions/callback_handlers/subscription_feeder_handlers.rbs +17 -12
  275. data/sig/pg_eventstore/subscriptions/callback_handlers/subscription_runner_handlers.rbs +16 -8
  276. data/sig/pg_eventstore/subscriptions/event_subscription_position_queries.rbs +30 -0
  277. data/sig/pg_eventstore/subscriptions/events_processor.rbs +12 -5
  278. data/sig/pg_eventstore/subscriptions/events_processor_consumer/multiple.rbs +17 -0
  279. data/sig/pg_eventstore/subscriptions/events_processor_consumer/replica.rbs +17 -0
  280. data/sig/pg_eventstore/subscriptions/events_processor_consumer/single.rbs +17 -0
  281. data/sig/pg_eventstore/subscriptions/events_processor_consumer.rbs +14 -0
  282. data/sig/pg_eventstore/subscriptions/events_subscription_position_worker.rbs +28 -0
  283. data/sig/pg_eventstore/subscriptions/queries/subscription_queries.rbs +18 -50
  284. data/sig/pg_eventstore/subscriptions/replica_subscription_handler.rbs +33 -0
  285. data/sig/pg_eventstore/subscriptions/replica_subscription_runner.rbs +4 -0
  286. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/collection.rbs +14 -0
  287. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/index_read_strategy.rbs +23 -0
  288. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/replication_strategy.rbs +23 -0
  289. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy.rbs +11 -0
  290. data/sig/pg_eventstore/subscriptions/subscription_feeder.rbs +13 -10
  291. data/sig/pg_eventstore/subscriptions/subscription_handler_performance.rbs +1 -1
  292. data/sig/pg_eventstore/subscriptions/subscription_runner.rbs +13 -5
  293. data/sig/pg_eventstore/subscriptions/subscription_runners_feeder.rbs +5 -5
  294. data/sig/pg_eventstore/subscriptions/subscriptions_lifecycle.rbs +4 -6
  295. data/sig/pg_eventstore/subscriptions/subscriptions_manager.rbs +29 -43
  296. data/sig/pg_eventstore/synchronized_array.rbs +4 -0
  297. data/sig/pg_eventstore/utils.rbs +18 -11
  298. data/sig/pg_eventstore/web/application.rbs +13 -3
  299. data/sig/pg_eventstore/web/paginator/base_collection.rbs +2 -0
  300. data/sig/pg_eventstore/web/paginator/event_types_collection.rbs +4 -0
  301. data/sig/pg_eventstore/web/paginator/events_collection.rbs +11 -11
  302. data/sig/pg_eventstore/web/paginator/helpers.rbs +6 -15
  303. data/sig/pg_eventstore/web/paginator/markers_collection.rbs +13 -0
  304. data/sig/pg_eventstore/web/paginator/stream_contexts_collection.rbs +4 -0
  305. data/sig/pg_eventstore/web/paginator/stream_names_collection.rbs +4 -0
  306. data/sig/pg_eventstore/web/paginator/streams_collection.rbs +30 -0
  307. data/sig/pg_eventstore.rbs +8 -26
  308. metadata +181 -21
  309. data/lib/pg_eventstore/commands/all_stream_read_grouped.rb +0 -69
  310. data/lib/pg_eventstore/commands/regular_stream_read_grouped.rb +0 -31
  311. data/lib/pg_eventstore/subscriptions/queries/service_queries.rb +0 -73
  312. data/lib/pg_eventstore/subscriptions/subscription_position_evaluation.rb +0 -195
  313. data/lib/pg_eventstore/web/views/home/partials/system_stream_filter.erb +0 -15
  314. data/sig/pg_eventstore/commands/all_stream_read_grouped.rbs +0 -16
  315. data/sig/pg_eventstore/commands/regular_stream_read_grouped.rbs +0 -8
  316. data/sig/pg_eventstore/subscriptions/queries/service_queries.rbs +0 -15
  317. data/sig/pg_eventstore/subscriptions/subscription_position_evaluation.rbs +0 -53
  318. data/sig/pg_eventstore/subscriptions/synchronized_array.rbs +0 -4
  319. /data/sig/interfaces/{_raw_event_handler.rbs → raw_event_handler.rbs} +0 -0
@@ -1,12 +1,12 @@
1
1
  <script type="text/html" id="stream-filter-tmpl">
2
2
  <%= erb :'home/partials/stream_filter', { layout: false }, { stream: {} } %>
3
3
  </script>
4
- <script type="text/html" id="system-stream-filter-tmpl">
5
- <%= erb :'home/partials/system_stream_filter', { layout: false }, { stream: nil } %>
6
- </script>
7
4
  <script type="text/html" id="event-type-filter-tmpl">
8
5
  <%= erb :'home/partials/event_filter', { layout: false }, { event_type: '' } %>
9
6
  </script>
7
+ <script type="text/html" id="markers-filter-tmpl">
8
+ <%= erb :'home/partials/markers_filter', { layout: false }, { markers: [] } %>
9
+ </script>
10
10
 
11
11
  <div class="right_col" role="main">
12
12
  <div class="">
@@ -30,11 +30,6 @@
30
30
  <form id="filters-form" action="<%= url('/') %>" method="GET" data-parsley-validate class="form-horizontal form-label-left">
31
31
  <input type="hidden" name="per_page" value="<%= params[:per_page].to_i %>">
32
32
  <input type="hidden" name="resolve_link_tos" value="<%= resolve_link_tos? %>">
33
- <div class="system-stream-filter">
34
- <% if system_stream %>
35
- <%= erb :'home/partials/system_stream_filter', { layout: false }, { stream: system_stream } %>
36
- <% end %>
37
- </div>
38
33
  <div class="stream-filters">
39
34
  <% streams_filter&.each do |attrs| %>
40
35
  <%= erb :'home/partials/stream_filter', { layout: false }, { stream: attrs } %>
@@ -45,6 +40,11 @@
45
40
  <%= erb :'home/partials/event_filter', { layout: false }, { event_type: event_type } %>
46
41
  <% end %>
47
42
  </div>
43
+ <div class="markers-filter">
44
+ <% if markers_filter.any? %>
45
+ <%= erb :'home/partials/markers_filter', { layout: false }, { markers: markers_filter } %>
46
+ <% end %>
47
+ </div>
48
48
  <div class="ln_solid"></div>
49
49
  <div class="item form-group">
50
50
  <div class="col-md-6 col-sm-6 offset-md-5">
@@ -58,6 +58,7 @@
58
58
  <a class="dropdown-item add-stream-filter" href="javascript: void(0)">Add stream filter</a>
59
59
  <a class="dropdown-item add-system-stream-filter" href="javascript: void(0)">Add system stream filter</a>
60
60
  <a class="dropdown-item add-event-filter" href="javascript: void(0)">Add event filter</a>
61
+ <a class="dropdown-item add-markers-filter" href="javascript: void(0)">Add markers filter</a>
61
62
  </div>
62
63
  </div>
63
64
  </div>
@@ -143,6 +144,7 @@
143
144
  <a href="<%= sort_url('asc') %>"><i class="fa fa-sort-asc"></i></a>
144
145
  <% end %>
145
146
  </th>
147
+ <th>Subscription position</th>
146
148
  <th>Stream revision</th>
147
149
  <th>Context</th>
148
150
  <th>Stream name</th>
@@ -154,7 +156,7 @@
154
156
  </tr>
155
157
  </thead>
156
158
  <tbody>
157
- <%= erb :'home/partials/events', { layout: false }, { events: @collection.collection } %>
159
+ <%= erb :'home/partials/events', { layout: false }, { events: @collection.collection, gp_to_sp_map: @gp_to_sp_map } %>
158
160
  </tbody>
159
161
  </table>
160
162
  </div>
@@ -1,12 +1,25 @@
1
+ <% type = event_type.is_a?(Hash) ? event_type[:type] : event_type %>
2
+ <% markers = event_type.is_a?(Hash) ? event_type[:markers] : [] %>
1
3
  <div class="form-row align-items-center">
2
- <div class="col-11">
3
- <select name="filter[events][]" class="form-control mb-2" data-placeholder="Event type" data-url="<%= url('/event_types_filtering') %>" autocomplete="off">
4
+ <div class="col-5">
5
+ <select name="filter[events][][type]" class="form-control mb-2 type-filter" data-placeholder="Event type" data-url="<%= url('/event_types_filtering') %>" autocomplete="off">
4
6
  <option></option>
5
- <% if event_type %>
6
- <% if event_type == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
7
+ <% if type %>
8
+ <% if type == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
7
9
  <option class="zero-byte-val" selected></option>
8
10
  <% else %>
9
- <option value="<%= h event_type %>" selected><%= h event_type %></option>
11
+ <option value="<%= h type %>" selected><%= h type %></option>
12
+ <% end %>
13
+ <% end %>
14
+ </select>
15
+ </div>
16
+ <div class="col-5">
17
+ <select name="filter[events][][markers][]" class="form-control mb-2 event-markers-filter" data-placeholder="Event markers" data-url="<%= url('/markers_filtering') %>" autocomplete="off" multiple>
18
+ <% markers.each do |marker| %>
19
+ <% if marker == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
20
+ <option class="zero-byte-val" selected></option>
21
+ <% else %>
22
+ <option value="<%= h marker %>" selected><%= h marker %></option>
10
23
  <% end %>
11
24
  <% end %>
12
25
  </select>
@@ -1,11 +1,18 @@
1
1
  <% events.each do |event| %>
2
2
  <tr>
3
3
  <td><%= event.global_position %></td>
4
+ <td class="subscription-position">
5
+ <% if gp_to_sp_map[event.global_position] %>
6
+ <%= gp_to_sp_map[event.global_position] %>
7
+ <% else %>
8
+ <i>Not yet assigned</i>
9
+ <% end %>
10
+ </td>
4
11
  <td><%= event.stream_revision %></td>
5
12
  <td><%= empty_characters_fallback(h event.stream.context) %></td>
6
13
  <td><%= empty_characters_fallback(h event.stream.stream_name) %></td>
7
14
  <td>
8
- <a href="<%= stream_path(event) %>"><%= empty_characters_fallback(h event.stream.stream_id) %></a>
15
+ <a href="<%= stream_path(event.stream) %>"><%= empty_characters_fallback(h event.stream.stream_id) %></a>
9
16
  <a role="button" href="#" data-title="Copy stream definition." class="copy-to-clipboard"
10
17
  data-clipboard-content="<%= h "PgEventstore::Stream.new(context: #{event.stream.context.inspect}, stream_name: #{event.stream.stream_name.inspect}, stream_id: #{event.stream.stream_id.inspect})" %>">
11
18
  <i class="fa fa-clipboard"></i>
@@ -37,6 +44,36 @@
37
44
  <pre><%= h JSON.pretty_generate(event.data) %></pre>
38
45
  <strong>Metadata:</strong>
39
46
  <pre><%= h JSON.pretty_generate(event.metadata) %></pre>
47
+ <strong>Markers:</strong>
48
+ <% if event.markers.any? || event.feature_markers.any? %>
49
+ <br>
50
+ <i>Total markers: <%= event.markers.size + event.feature_markers.size %>. List is scrollable</i>
51
+ <div style="max-height: 200px; overflow: scroll">
52
+ <% if event.feature_markers.any? %>
53
+ Feature markers
54
+ <ul>
55
+ <% event.feature_markers.each do |feature_marker| %>
56
+ <li>
57
+ <%= "#{h feature_marker.description}:" if feature_marker.description %>
58
+ <a href="<%= event_marker_path(feature_marker.marker) %>">
59
+ <%= empty_characters_fallback(h feature_marker.marker) %>
60
+ </a>
61
+ </li>
62
+ <% end %>
63
+ </ul>
64
+ <% end %>
65
+ <% if event.markers.any? %>
66
+ Event markers
67
+ <ul>
68
+ <% event.markers.each do |marker| %>
69
+ <li> <a href="<%= event_marker_path(marker) %>"><%= empty_characters_fallback(h marker) %></a> </li>
70
+ <% end %>
71
+ </ul>
72
+ <% end %>
73
+ </div>
74
+ <% else %>
75
+ <i>No markers assigned</i>
76
+ <% end %>
40
77
  </td>
41
78
  </tr>
42
79
  <% end %>
@@ -0,0 +1,18 @@
1
+ <div class="form-row align-items-center">
2
+ <div class="col-11">
3
+ <select name="filter[markers][]" class="form-control mb-2 markers-filter" data-placeholder="Event markers" data-url="<%= url('/markers_filtering') %>" autocomplete="off" multiple>
4
+ <% markers.each do |marker| %>
5
+ <% if marker == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
6
+ <option class="zero-byte-val" selected></option>
7
+ <% else %>
8
+ <option value="<%= h marker %>" selected><%= h marker %></option>
9
+ <% end %>
10
+ <% end %>
11
+ </select>
12
+ </div>
13
+ <div class="col-1">
14
+ <a class="btn btn-default remove-filter" href="javascript: void(0);">
15
+ <i class="fa fa-minus-circle"></i>
16
+ </a>
17
+ </div>
18
+ </div>
@@ -59,6 +59,12 @@
59
59
  Events lookup
60
60
  </a>
61
61
  </li>
62
+ <li>
63
+ <a href="<%= url('/streams') %>">
64
+ <i class="fa fa-search-plus"></i>
65
+ Streams list
66
+ </a>
67
+ </li>
62
68
  <li>
63
69
  <a href="<%= url('/subscriptions') %>">
64
70
  <i class="fa fa-pencil-square-o"></i>
@@ -0,0 +1,110 @@
1
+ <div class="right_col" role="main">
2
+ <div class="">
3
+ <div class="page-title">
4
+ <div class="title_left">
5
+ <h3>Streams list</h3>
6
+ </div>
7
+ </div>
8
+
9
+ <div class="clearfix"></div>
10
+
11
+ <div class="row">
12
+ <div class="col-md-12 col-sm-12">
13
+ <div class="x_panel">
14
+ <div class="x_title">
15
+ <div class="row">
16
+ <div class="col-md-3 col-sm-12">
17
+ <h2>
18
+ Streams
19
+ <small id="total-count"><%= total_count(@collection.total_count) %></small>
20
+ </h2>
21
+ <div class="clearfix"></div>
22
+ </div>
23
+ <div class="col-md-6 col-sm-12">
24
+ <form class="form-horizontal form-label-left float-md-right">
25
+ <div class="form-group float-md-right">
26
+ <label class="control-label text-nowrap float-left mr-2" for="per_page_select">Per page</label>
27
+ <select class="page-link text-dark float-left" name="per_page" id="per_page_select">
28
+ <% PgEventstore::Web::Paginator::StreamsCollection::PER_PAGE.keys.each do |per_page| %>
29
+ <option <%= 'selected="selected"' if params[:per_page] == per_page %> data-url="<%= per_page_url(per_page) %>">
30
+ <%= per_page %>
31
+ </option>
32
+ <% end %>
33
+ </select>
34
+ <button type="submit" class="d-none"></button>
35
+ </div>
36
+ </form>
37
+ </div>
38
+ <div class="col-md-3 col-sm-12">
39
+ <nav aria-label="Page navigation">
40
+ <ul class="pagination justify-content-md-end" id="pagination">
41
+ <%= erb :'home/partials/pagination_links', { layout: false }, { collection: @collection } %>
42
+ </ul>
43
+ </nav>
44
+ <div class="clearfix"></div>
45
+ </div>
46
+ <div class="clearfix"></div>
47
+ </div>
48
+ </div>
49
+ <div class="x_content table-responsive">
50
+ <table class="table table-hover" id="events-table">
51
+ <thead>
52
+ <tr>
53
+ <th>
54
+ Starting position
55
+ <% if params[:order] == 'asc' %>
56
+ <a href="<%= sort_url('desc') %>"><i class="fa fa-sort-desc"></i></a>
57
+ <% else %>
58
+ <a href="<%= sort_url('asc') %>"><i class="fa fa-sort-asc"></i></a>
59
+ <% end %>
60
+ </th>
61
+ <th>Context</th>
62
+ <th>Stream name</th>
63
+ <th>Stream ID</th>
64
+ <th>Stream revision</th>
65
+ </tr>
66
+ </thead>
67
+ <tbody>
68
+ <%= erb :'streams/partials/streams', { layout: false }, { streams: @collection.collection } %>
69
+ </tbody>
70
+ </table>
71
+ </div>
72
+ </div>
73
+ </div>
74
+
75
+ <div class="clearfix"></div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+
80
+ <div class="modal fade" id="delete-event-modal" tabindex="-1" role="dialog" aria-labelledby="delete-event-modal" aria-hidden="true">
81
+ <div class="modal-dialog modal-dialog-centered" role="document">
82
+ <div class="modal-content">
83
+ <div class="modal-header">
84
+ <h5 class="modal-title">Delete Event</h5>
85
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
86
+ <span aria-hidden="true">&times;</span>
87
+ </button>
88
+ </div>
89
+ <div class="modal-body font-weight-bold text-break">
90
+ <h5>
91
+ You are about to delete Event on global position <span class="global-position-text"></span>. This action is irreversible. Continue?
92
+ </h5>
93
+
94
+ <form id="delete-event-form" data-parsley-validate="" class="form-horizontal form-label-left" novalidate="" method="POST">
95
+ <input type="hidden" name="data[force]" value="false">
96
+ <div class="checkbox">
97
+ <label>
98
+ <input type="checkbox" id="force-delete" name="data[force]" autocomplete="off" value="true">
99
+ Ignore limitations(see <a class="text-info" href="https://github.com/yousty/pg_eventstore/blob/main/docs/maintenance.md#deleting-an-event-in-a-large-stream" target="_blank" rel="noreferrer,nofollow">docs</a>).
100
+ </label>
101
+ </div>
102
+ </form>
103
+ </div>
104
+ <div class="modal-footer">
105
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
106
+ <button type="submit" class="btn btn-danger" form="delete-event-form">Delete</button>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </div>
@@ -0,0 +1,11 @@
1
+ <% streams.each do |stream| %>
2
+ <tr>
3
+ <td><%= stream.starting_position %></td>
4
+ <td><%= empty_characters_fallback(h stream.context) %></td>
5
+ <td><%= empty_characters_fallback(h stream.stream_name) %></td>
6
+ <td>
7
+ <a href="<%= stream_path(stream) %>" target="_blank"><%= empty_characters_fallback(h stream.stream_id) %></a>
8
+ </td>
9
+ <td><%= stream.stream_revision %></td>
10
+ </tr>
11
+ <% end %>
@@ -139,7 +139,10 @@
139
139
  <th>Pull interval</th>
140
140
  <th>Last event arrived at</th>
141
141
  <th>State</th>
142
- <th>Performance</th>
142
+ <th>
143
+ Performance
144
+ <i class="fa fa-question-circle" data-toggle="tooltip" title="Subscription handler performance"></i>
145
+ </th>
143
146
  <th>Restarts count</th>
144
147
  <th>Max restarts number</th>
145
148
  <th>Time between restarts</th>
@@ -5,10 +5,12 @@ require 'sinatra/base'
5
5
  require_relative 'web/paginator/helpers'
6
6
  require_relative 'web/paginator/base_collection'
7
7
  require_relative 'web/paginator/events_collection'
8
+ require_relative 'web/paginator/streams_collection'
8
9
  require_relative 'web/paginator/stream_contexts_collection'
9
10
  require_relative 'web/paginator/stream_names_collection'
10
11
  require_relative 'web/paginator/stream_ids_collection'
11
12
  require_relative 'web/paginator/event_types_collection'
13
+ require_relative 'web/paginator/markers_collection'
12
14
  require_relative 'web/subscriptions/set_collection'
13
15
  require_relative 'web/subscriptions/subscriptions'
14
16
  require_relative 'web/subscriptions/subscriptions_set'
data/lib/pg_eventstore.rb CHANGED
@@ -1,17 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'securerandom'
3
4
  require_relative 'pg_eventstore/version'
4
5
  require_relative 'pg_eventstore/utils'
5
6
  require_relative 'pg_eventstore/callbacks'
6
7
  require_relative 'pg_eventstore/extensions/options_extension'
8
+ require_relative 'pg_eventstore/extensions/options_defaults'
7
9
  require_relative 'pg_eventstore/extensions/callbacks_extension'
8
10
  require_relative 'pg_eventstore/extensions/callback_handlers_extension'
9
11
  require_relative 'pg_eventstore/extensions/using_connection_extension'
10
12
  require_relative 'pg_eventstore/event_class_resolver'
13
+ require_relative 'pg_eventstore/basic_config'
11
14
  require_relative 'pg_eventstore/config'
12
15
  require_relative 'pg_eventstore/partition'
13
16
  require_relative 'pg_eventstore/event'
17
+ require_relative 'pg_eventstore/raw_event'
14
18
  require_relative 'pg_eventstore/stream'
19
+ require_relative 'pg_eventstore/event_global_index'
20
+ require_relative 'pg_eventstore/stream_global_index'
21
+ require_relative 'pg_eventstore/event_marker_index'
22
+ require_relative 'pg_eventstore/event_marker'
23
+ require_relative 'pg_eventstore/feature_marker'
15
24
  require_relative 'pg_eventstore/commands'
16
25
  require_relative 'pg_eventstore/queries'
17
26
  require_relative 'pg_eventstore/client'
@@ -19,68 +28,24 @@ require_relative 'pg_eventstore/maintenance'
19
28
  require_relative 'pg_eventstore/connection'
20
29
  require_relative 'pg_eventstore/errors'
21
30
  require_relative 'pg_eventstore/middleware'
31
+ require_relative 'pg_eventstore/middleware/event_tracing'
32
+ require_relative 'pg_eventstore/synchronized_array'
33
+ require_relative 'pg_eventstore/chunks'
22
34
  require_relative 'pg_eventstore/subscriptions/subscriptions_manager'
35
+ require_relative 'pg_eventstore/extensions/acts_as_configurable'
36
+ require_relative 'pg_eventstore/async_runner'
37
+ require_relative 'pg_eventstore/query_strategy'
38
+ require_relative 'pg_eventstore_ext'
23
39
 
24
40
  module PgEventstore
25
- # @return [Symbol]
26
- DEFAULT_CONFIG = :default
41
+ extend Extensions::ActsAsConfigurable
27
42
 
28
- class << self
29
- # @!attribute mutex
30
- # @return [Thread::Mutex]
31
- attr_reader :mutex
32
- private :mutex
43
+ acts_as_configurable(config_class: Config)
33
44
 
45
+ class << self
34
46
  # @return [Logger, nil]
35
47
  attr_accessor :logger
36
48
 
37
- # Creates a Config if not exists and yields it to the given block.
38
- # @param name [Symbol] a name to assign to a config
39
- # @return [Object] a result of the given block
40
- def configure(name: DEFAULT_CONFIG)
41
- mutex.synchronize do
42
- @config[name] = @config[name] ? Config.new(name: name, **@config[name].options_hash) : Config.new(name: name)
43
- connection_config_was = @config[name].connection_options
44
-
45
- yield(@config[name]).tap do
46
- @config[name].freeze
47
- next if connection_config_was == @config[name].connection_options
48
-
49
- # Reset the connection if user decided to reconfigure connection's options
50
- @connection.delete(name)
51
- end
52
- end
53
- end
54
-
55
- # @return [Array<Symbol>]
56
- def available_configs
57
- @config.keys
58
- end
59
-
60
- # @param name [Symbol]
61
- # @return [PgEventstore::Config]
62
- def config(name = DEFAULT_CONFIG)
63
- return @config[name] if @config[name]
64
-
65
- error_message = <<~TEXT
66
- Could not find #{name.inspect} config. You can define it like this:
67
- PgEventstore.configure(name: #{name.inspect}) do |config|
68
- # your config goes here
69
- end
70
- TEXT
71
- raise error_message
72
- end
73
-
74
- # Look ups and returns a Connection, based on the given config. If not exists - it creates one. This operation is a
75
- # thread-safe
76
- # @param name [Symbol]
77
- # @return [PgEventstore::Connection]
78
- def connection(name = DEFAULT_CONFIG)
79
- mutex.synchronize do
80
- @connection[name] ||= Connection.new(**config(name).connection_options)
81
- end
82
- end
83
-
84
49
  # @param config_name [Symbol]
85
50
  # @param subscription_set [String]
86
51
  # @param max_retries [Integer, nil] max number of retries of failed SubscriptionsSet
@@ -92,9 +57,9 @@ module PgEventstore
92
57
  SubscriptionsManager.new(
93
58
  config: config(config_name),
94
59
  set_name: subscription_set,
95
- max_retries: max_retries,
96
- retries_interval: retries_interval,
97
- force_lock: force_lock
60
+ max_retries:,
61
+ retries_interval:,
62
+ force_lock:
98
63
  )
99
64
  end
100
65
 
@@ -112,12 +77,10 @@ module PgEventstore
112
77
 
113
78
  private
114
79
 
115
- # @return [void]
116
- def init_variables
117
- @config = { DEFAULT_CONFIG => Config.new(name: DEFAULT_CONFIG) }
118
- @connection = {}
119
- @mutex = Thread::Mutex.new
80
+ # @param config [Config]
81
+ # @return [Hash]
82
+ def connection_options(config)
83
+ { uri: config.pg_uri, pool_size: config.connection_pool_size, pool_timeout: config.connection_pool_timeout }
120
84
  end
121
85
  end
122
- init_variables
123
86
  end
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = 'EventStore implementation using PostgreSQL'
13
13
  spec.homepage = 'https://github.com/yousty/pg_eventstore'
14
14
  spec.license = 'MIT'
15
- spec.required_ruby_version = '>= 3.0'
15
+ spec.required_ruby_version = '>= 3.3'
16
16
 
17
17
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
18
18
 
@@ -27,15 +27,17 @@ Gem::Specification.new do |spec|
27
27
  bin/ test/ spec/ features/ .git .circleci appveyor Gemfile .ruby-version .ruby-gemset .rspec docker-compose.yml
28
28
  Rakefile benchmark/ .yardopts db/structure.sql config.ru docs/images/
29
29
  ]
30
- `git ls-files -z`.split("\x0").reject do |f|
30
+ files = `git ls-files -z`.split("\x0") + Dir['ext/**/*.{c,rb}']
31
+ files.uniq.reject do |f|
31
32
  (File.expand_path(f) == __FILE__) || f.start_with?(*paths_to_exclude) || File.extname(f) == '.map'
32
33
  end
33
34
  end
34
35
  spec.bindir = 'exe'
35
36
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
37
+ spec.extensions = ['ext/pg_eventstore_ext/extconf.rb']
36
38
  spec.require_paths = ['lib']
37
39
 
38
- spec.add_dependency 'connection_pool', '~> 2.4'
39
- spec.add_dependency 'pg', '~> 1.5'
40
+ spec.add_dependency 'connection_pool', '>= 2.5.4', '< 4'
41
+ spec.add_dependency 'pg', '~> 1'
40
42
  spec.add_dependency 'sinatra', '>= 3', '< 5'
41
43
  end
@@ -0,0 +1,3 @@
1
+ interface _RawEventsHandler
2
+ def call: (Array[Hash[String, untyped]] events) -> void
3
+ end
@@ -1,3 +1,3 @@
1
1
  interface _SubscriptionHandler
2
- def call: (PgEventstore::Event event) -> void
2
+ def call: (PgEventstore::Event | Array[PgEventstore::Event] event) -> void
3
3
  end
data/sig/pg/result.rbs ADDED
@@ -0,0 +1,9 @@
1
+ module PG
2
+ class Result
3
+ def map_types!: (untyped type_map) -> self
4
+
5
+ def field_names_as: (Symbol type_map) -> self
6
+
7
+ def inspect: -> String
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module PgEventstore
2
+ class AsyncRunner
3
+ @jobs: Hash[Fiber, bool]
4
+
5
+ def async: () { -> void } -> void
6
+
7
+ def jobs_size: -> Integer
8
+
9
+ def run: -> void
10
+
11
+ def run_once: -> void
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module PgEventstore
2
+ class BasicConfig
3
+ include Extensions::OptionsExtension
4
+
5
+ attr_reader name: Symbol
6
+
7
+ def initialize: (name: Symbol, **untyped options) -> void
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module PgEventstore
2
+ module Chunks
3
+ module Chunk[unchecked ElemIn, unchecked ElemOut]
4
+ def drained?: -> bool
5
+
6
+ def last: -> ElemIn?
7
+
8
+ def size: -> Integer
9
+
10
+ def take: (Integer? size) -> Array[ElemOut]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ module PgEventstore
2
+ module Chunks
3
+ class ReadApiEventsIndexChunk
4
+ include Chunk[EventGlobalIndex::ReadApiRepr, Hash[String, untyped]]
5
+
6
+ MAX_PARTITIONS_TO_RESOLVE_PER_CALL: Integer
7
+
8
+ @connection: Connection
9
+ @raw_events: Array[Hash[String, untyped]]
10
+ @idx_direction: Symbol
11
+ @indexes: Array[EventGlobalIndex::ReadApiRepr]
12
+ @query_strategy: QueryStrategy
13
+ @resolve_link_tos: bool
14
+ @resolved: bool
15
+
16
+ def initialize: (Array[EventGlobalIndex::ReadApiRepr] indexes, Connection connection,
17
+ QueryStrategy query_strategy, bool resolve_link_tos) -> void
18
+
19
+ private
20
+
21
+ def detect_direction: (EventGlobalIndex::ReadApiRepr? idx1, EventGlobalIndex::ReadApiRepr? idx2) -> Symbol
22
+
23
+ def events_global_index_queries: -> EventsGlobalIndexQueries
24
+
25
+ def resolve_indexes: -> void
26
+
27
+ def resolved?: -> bool
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ module PgEventstore
2
+ module Chunks
3
+ class ReplicaEventsIndexChunk
4
+ include Chunk[EventGlobalIndex::SubscriptionRepr, EventGlobalIndex::SubscriptionRepr]
5
+
6
+ @indexes: Array[EventGlobalIndex::SubscriptionRepr]
7
+
8
+ def initialize: (Array[EventGlobalIndex::SubscriptionRepr] indexes) -> void
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ module PgEventstore
2
+ module Chunks
3
+ class Repository
4
+ include MonitorMixin
5
+
6
+ @chunks: SynchronizedArray[Chunk[untyped, untyped]]
7
+
8
+ def add_chunk: (Chunk[untyped, untyped] chunk, ?condition: MonitorMixin::ConditionVariable?) -> void
9
+
10
+ def clear: -> void
11
+
12
+ def consume_all: -> untyped
13
+
14
+ def empty?: -> bool
15
+
16
+ def size: -> Integer
17
+
18
+ def wait_and_consume: (entities_num: Integer?, timeout: Float | Integer,
19
+ condition: MonitorMixin::ConditionVariable) -> Array[untyped]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ module PgEventstore
2
+ module Chunks
3
+ class SubscriptionCheckpointChunk
4
+ class Checkpoint
5
+ include Extensions::OptionsExtension
6
+ include Extensions::OptionsDefaults
7
+
8
+ attr_reader subscription_position: Integer
9
+ end
10
+
11
+ include Chunk[Checkpoint, Checkpoint]
12
+
13
+ @checkpoint_event: Checkpoint?
14
+
15
+ def initialize: (Integer position) -> void
16
+ end
17
+ end
18
+ end