ruby_event_store 1.1.1 → 2.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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.mutant.yml +1 -0
  3. data/Gemfile +3 -4
  4. data/Gemfile.lock +118 -0
  5. data/Makefile +13 -2
  6. data/lib/ruby_event_store.rb +4 -7
  7. data/lib/ruby_event_store/broker.rb +3 -3
  8. data/lib/ruby_event_store/client.rb +60 -26
  9. data/lib/ruby_event_store/composed_dispatcher.rb +2 -2
  10. data/lib/ruby_event_store/constants.rb +1 -0
  11. data/lib/ruby_event_store/errors.rb +0 -1
  12. data/lib/ruby_event_store/event.rb +8 -1
  13. data/lib/ruby_event_store/immediate_async_dispatcher.rb +2 -2
  14. data/lib/ruby_event_store/in_memory_repository.rb +98 -58
  15. data/lib/ruby_event_store/instrumented_dispatcher.rb +2 -2
  16. data/lib/ruby_event_store/mappers/default.rb +28 -6
  17. data/lib/ruby_event_store/mappers/deprecated_wrapper.rb +33 -0
  18. data/lib/ruby_event_store/mappers/encryption_mapper.rb +1 -4
  19. data/lib/ruby_event_store/mappers/instrumented_mapper.rb +8 -4
  20. data/lib/ruby_event_store/mappers/json_mapper.rb +2 -4
  21. data/lib/ruby_event_store/mappers/pipeline.rb +26 -5
  22. data/lib/ruby_event_store/mappers/pipeline_mapper.rb +6 -2
  23. data/lib/ruby_event_store/mappers/transformation/domain_event.rb +16 -8
  24. data/lib/ruby_event_store/mappers/transformation/encryption.rb +22 -13
  25. data/lib/ruby_event_store/mappers/transformation/event_class_remapper.rb +11 -4
  26. data/lib/ruby_event_store/mappers/transformation/serialization.rb +16 -14
  27. data/lib/ruby_event_store/mappers/transformation/stringify_metadata_keys.rb +12 -7
  28. data/lib/ruby_event_store/mappers/transformation/symbolize_metadata_keys.rb +12 -7
  29. data/lib/ruby_event_store/null.rb +13 -0
  30. data/lib/ruby_event_store/projection.rb +2 -1
  31. data/lib/ruby_event_store/record.rb +68 -0
  32. data/lib/ruby_event_store/serialized_record.rb +23 -4
  33. data/lib/ruby_event_store/spec/broker_lint.rb +9 -9
  34. data/lib/ruby_event_store/spec/event_repository_lint.rb +200 -36
  35. data/lib/ruby_event_store/spec/mapper_lint.rb +6 -6
  36. data/lib/ruby_event_store/spec/subscriptions_lint.rb +6 -0
  37. data/lib/ruby_event_store/specification.rb +100 -7
  38. data/lib/ruby_event_store/specification_reader.rb +2 -2
  39. data/lib/ruby_event_store/specification_result.rb +86 -2
  40. data/lib/ruby_event_store/version.rb +1 -1
  41. data/ruby_event_store.gemspec +0 -2
  42. metadata +12 -13
  43. data/lib/ruby_event_store/mappers/protobuf.rb +0 -24
  44. data/lib/ruby_event_store/mappers/transformation/item.rb +0 -56
  45. data/lib/ruby_event_store/mappers/transformation/proto_event.rb +0 -17
  46. data/lib/ruby_event_store/mappers/transformation/protobuf_encoder.rb +0 -30
  47. data/lib/ruby_event_store/mappers/transformation/protobuf_nested_struct_metadata.rb +0 -30
  48. data/lib/ruby_event_store/mappers/transformation/serialized_record.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c14775d70ee44777790b8b916ceee3b7801439494711a701aabb5a8904e8270
4
- data.tar.gz: 9c11cdd6cc8a13a8e16749928acb174c1cc11ca5a5e56aae2d9338fbbb42f842
3
+ metadata.gz: f3c88fc2b8bb6cc690ca8518b0d05e81e648969f21047aaa630c122b3d62d039
4
+ data.tar.gz: 62de2a86056dfe64d42bcdb58b37054152bda5cec7e8614239ffab7ea06b14a8
5
5
  SHA512:
6
- metadata.gz: 15c4530f8da5f71f6e411296a7e228ccea5dc0a3b836cfa90d7ba6c9f1462881d85963d1f68e0995f7b86bf27f9ae4981a551e3fbd1aa8b5213238488144ecba
7
- data.tar.gz: d925c31f958e72529c43fe4a006e74a0140b37bbddd667e1ac19cebca66963c59903a1aac136f1b080b2977b2019bb5e79c21bf9ab6bca5aa23c9f1db45293a8
6
+ metadata.gz: 5cd0b9296fdf313dd30ee7d5dc4ce3d09f83b10675da8cf735dbbab8043ee1725e13d3c29e574d3bc16f0e57b7059dc5856f2a406b444cdbb514f511b35bad32
7
+ data.tar.gz: 40624c5a6101794364f0c952e78b74e127924b6aade3b53e028d7715d72b198ca58bf4a0fe2bc001220e1c4a5f580221ff686ec40994edff2abb6b4bd42b7620
@@ -0,0 +1 @@
1
+ ../.mutant.yml
data/Gemfile CHANGED
@@ -3,8 +3,7 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
3
 
4
4
  gemspec
5
5
 
6
- eval_gemfile File.expand_path('../support/bundler/Gemfile.shared', __dir__)
6
+ eval_gemfile '../support/bundler/Gemfile.shared'
7
7
 
8
- gem 'protobuf_nested_struct'
9
- gem 'google-protobuf', '~> 3.12.2', '>= 3.12.2'
10
- gem 'activesupport', '~> 5.0'
8
+ gem 'activesupport', '6.0.3.4'
9
+ gem 'concurrent-ruby', github: 'ruby-concurrency/concurrent-ruby', ref: 'c4cbc968c55e5b983dae953095761896220c46d1'
@@ -0,0 +1,118 @@
1
+ GIT
2
+ remote: https://github.com/ruby-concurrency/concurrent-ruby.git
3
+ revision: c4cbc968c55e5b983dae953095761896220c46d1
4
+ ref: c4cbc968c55e5b983dae953095761896220c46d1
5
+ specs:
6
+ concurrent-ruby (1.1.7)
7
+
8
+ PATH
9
+ remote: .
10
+ specs:
11
+ ruby_event_store (2.0.0)
12
+ concurrent-ruby (~> 1.0, >= 1.1.6)
13
+
14
+ GEM
15
+ remote: https://rubygems.org/
16
+ remote: https://oss:7AXfeZdAfCqL1PvHm2nvDJO6Zd9UW8IK@gem.mutant.dev/
17
+ specs:
18
+ abstract_type (0.0.7)
19
+ activesupport (6.0.3.4)
20
+ concurrent-ruby (~> 1.0, >= 1.0.2)
21
+ i18n (>= 0.7, < 2)
22
+ minitest (~> 5.1)
23
+ tzinfo (~> 1.1)
24
+ zeitwerk (~> 2.2, >= 2.2.2)
25
+ adamantium (0.2.0)
26
+ ice_nine (~> 0.11.0)
27
+ memoizable (~> 0.4.0)
28
+ anima (0.3.2)
29
+ abstract_type (~> 0.0.7)
30
+ adamantium (~> 0.2)
31
+ equalizer (~> 0.0.11)
32
+ ast (2.4.1)
33
+ concord (0.1.6)
34
+ adamantium (~> 0.2.0)
35
+ equalizer (~> 0.0.9)
36
+ diff-lcs (1.4.4)
37
+ equalizer (0.0.11)
38
+ i18n (1.8.5)
39
+ concurrent-ruby (~> 1.0)
40
+ ice_nine (0.11.2)
41
+ memoizable (0.4.2)
42
+ thread_safe (~> 0.3, >= 0.3.1)
43
+ minitest (5.14.2)
44
+ mprelude (0.1.0)
45
+ abstract_type (~> 0.0.7)
46
+ adamantium (~> 0.2.0)
47
+ concord (~> 0.1.5)
48
+ equalizer (~> 0.0.9)
49
+ ice_nine (~> 0.11.1)
50
+ procto (~> 0.0.2)
51
+ mutant (0.10.22)
52
+ abstract_type (~> 0.0.7)
53
+ adamantium (~> 0.2.0)
54
+ anima (~> 0.3.1)
55
+ ast (~> 2.2)
56
+ concord (~> 0.1.5)
57
+ diff-lcs (~> 1.3)
58
+ equalizer (~> 0.0.9)
59
+ ice_nine (~> 0.11.1)
60
+ memoizable (~> 0.4.2)
61
+ mprelude (~> 0.1.0)
62
+ parser (~> 3.0.0)
63
+ procto (~> 0.0.2)
64
+ unparser (~> 0.5.6)
65
+ variable (~> 0.0.1)
66
+ mutant-license (0.1.1.2.1627430819213747598431630701693729869473.0)
67
+ mutant-rspec (0.10.22)
68
+ mutant (= 0.10.22)
69
+ rspec-core (>= 3.8.0, < 4.0.0)
70
+ parser (3.0.0.0)
71
+ ast (~> 2.4.1)
72
+ procto (0.0.3)
73
+ rake (13.0.3)
74
+ rspec (3.10.0)
75
+ rspec-core (~> 3.10.0)
76
+ rspec-expectations (~> 3.10.0)
77
+ rspec-mocks (~> 3.10.0)
78
+ rspec-core (3.10.1)
79
+ rspec-support (~> 3.10.0)
80
+ rspec-expectations (3.10.1)
81
+ diff-lcs (>= 1.2.0, < 2.0)
82
+ rspec-support (~> 3.10.0)
83
+ rspec-mocks (3.10.1)
84
+ diff-lcs (>= 1.2.0, < 2.0)
85
+ rspec-support (~> 3.10.0)
86
+ rspec-support (3.10.1)
87
+ thread_safe (0.3.6)
88
+ tzinfo (1.2.9)
89
+ thread_safe (~> 0.1)
90
+ unparser (0.5.6)
91
+ abstract_type (~> 0.0.7)
92
+ adamantium (~> 0.2.0)
93
+ anima (~> 0.3.1)
94
+ concord (~> 0.1.5)
95
+ diff-lcs (~> 1.3)
96
+ equalizer (~> 0.0.9)
97
+ mprelude (~> 0.1.0)
98
+ parser (>= 3.0.0)
99
+ procto (~> 0.0.2)
100
+ variable (0.0.1)
101
+ equalizer (~> 0.0.11)
102
+ zeitwerk (2.4.2)
103
+
104
+ PLATFORMS
105
+ ruby
106
+
107
+ DEPENDENCIES
108
+ activesupport (= 6.0.3.4)
109
+ concurrent-ruby!
110
+ mutant (~> 0.10.21)
111
+ mutant-license!
112
+ mutant-rspec (~> 0.10.21)
113
+ rake (>= 10.0)
114
+ rspec (~> 3.6)
115
+ ruby_event_store!
116
+
117
+ BUNDLED WITH
118
+ 2.1.4
data/Makefile CHANGED
@@ -1,7 +1,10 @@
1
1
  GEM_VERSION = $(shell cat ../RES_VERSION)
2
2
  GEM_NAME = ruby_event_store
3
3
  REQUIRE = $(GEM_NAME)
4
- IGNORE = RubyEventStore::InMemoryRepository\#append_with_synchronize \
4
+ IGNORE = RubyEventStore::InMemoryRepository\#with_synchronize \
5
+ RubyEventStore::Client\#initialize \
6
+ RubyEventStore::Client\#default_clock \
7
+ RubyEventStore::Client\#default_correlation_id_generator \
5
8
  RubyEventStore::Client::Within\#add_thread_subscribers \
6
9
  RubyEventStore::Client::Within\#add_thread_global_subscribers \
7
10
  RubyEventStore::Client::Within\#call \
@@ -10,7 +13,15 @@ IGNORE = RubyEventStore::InMemoryRepository\#append_with_synchronize \
10
13
  RubyEventStore::Mappers::EncryptionKey\#prepare_decrypt \
11
14
  RubyEventStore::Mappers::EncryptionKey\#prepare_auth_data \
12
15
  RubyEventStore::Mappers::EncryptionKey\#encrypt_authenticated \
13
- RubyEventStore::Mappers::EncryptionKey\#ciphertext_from_authenticated
16
+ RubyEventStore::Mappers::EncryptionKey\#ciphertext_from_authenticated \
17
+ RubyEventStore::Mappers::Default\#serializer \
18
+ RubyEventStore::Mappers::JSONMapper\#serializer \
19
+ RubyEventStore::Mappers::NullMapper\#serializer \
20
+ RubyEventStore::Mappers::EncryptionMapper\#serializer \
21
+ RubyEventStore::Mappers::PipelineMapper\#serializer \
22
+ RubyEventStore::Mappers::DeprecatedWrapper\#serializer \
23
+ RubyEventStore::Mappers::InstrumentedMapper\#serializer \
24
+ RubyEventStore::Mappers::Transformation::Serialization*
14
25
 
15
26
  SUBJECT ?= RubyEventStore*
16
27
 
@@ -15,30 +15,27 @@ require 'ruby_event_store/specification_reader'
15
15
  require 'ruby_event_store/event'
16
16
  require 'ruby_event_store/stream'
17
17
  require 'ruby_event_store/expected_version'
18
+ require 'ruby_event_store/record'
18
19
  require 'ruby_event_store/serialized_record'
20
+ require 'ruby_event_store/null'
19
21
  require 'ruby_event_store/transform_keys'
20
22
  require 'ruby_event_store/mappers/encryption_key'
21
23
  require 'ruby_event_store/mappers/in_memory_encryption_key_repository'
22
24
  require 'ruby_event_store/mappers/transformation/domain_event'
23
25
  require 'ruby_event_store/mappers/transformation/encryption'
24
26
  require 'ruby_event_store/mappers/transformation/event_class_remapper'
25
- require 'ruby_event_store/mappers/transformation/item'
26
- require 'ruby_event_store/mappers/transformation/proto_event'
27
- require 'ruby_event_store/mappers/transformation/protobuf_encoder'
28
- require 'ruby_event_store/mappers/transformation/protobuf_nested_struct_metadata'
29
- require 'ruby_event_store/mappers/transformation/serialization'
30
- require 'ruby_event_store/mappers/transformation/serialized_record'
31
27
  require 'ruby_event_store/mappers/transformation/stringify_metadata_keys'
32
28
  require 'ruby_event_store/mappers/transformation/symbolize_metadata_keys'
29
+ require 'ruby_event_store/mappers/transformation/serialization'
33
30
  require 'ruby_event_store/mappers/pipeline'
34
31
  require 'ruby_event_store/mappers/pipeline_mapper'
32
+ require 'ruby_event_store/mappers/deprecated_wrapper'
35
33
  require 'ruby_event_store/mappers/default'
36
34
  require 'ruby_event_store/mappers/forgotten_data'
37
35
  require 'ruby_event_store/mappers/encryption_mapper'
38
36
  require 'ruby_event_store/mappers/instrumented_mapper'
39
37
  require 'ruby_event_store/mappers/json_mapper'
40
38
  require 'ruby_event_store/mappers/null_mapper'
41
- require 'ruby_event_store/mappers/protobuf'
42
39
  require 'ruby_event_store/batch_enumerator'
43
40
  require 'ruby_event_store/correlated_commands'
44
41
  require 'ruby_event_store/link_by_metadata'
@@ -7,10 +7,10 @@ module RubyEventStore
7
7
  @dispatcher = dispatcher
8
8
  end
9
9
 
10
- def call(event, serialized_event)
10
+ def call(event, record)
11
11
  subscribers = subscriptions.all_for(event.event_type)
12
12
  subscribers.each do |subscriber|
13
- dispatcher.call(subscriber, event, serialized_event)
13
+ dispatcher.call(subscriber, event, record)
14
14
  end
15
15
  end
16
16
 
@@ -35,7 +35,7 @@ module RubyEventStore
35
35
  end
36
36
 
37
37
  private
38
- attr_reader :subscriptions, :dispatcher
38
+ attr_reader :dispatcher, :subscriptions
39
39
 
40
40
  def verify_subscription(subscriber)
41
41
  raise SubscriberNotExist, "subscriber must be first argument or block" unless subscriber
@@ -4,36 +4,40 @@ require 'concurrent'
4
4
 
5
5
  module RubyEventStore
6
6
  class Client
7
-
8
7
  def initialize(repository:,
9
8
  mapper: Mappers::Default.new,
10
9
  subscriptions: Subscriptions.new,
11
10
  dispatcher: Dispatcher.new,
12
- clock: ->{ Time.now.utc })
11
+ clock: default_clock,
12
+ correlation_id_generator: default_correlation_id_generator)
13
+
14
+
13
15
  @repository = repository
14
- @mapper = mapper
16
+ @mapper = Mappers::DeprecatedWrapper.new(mapper)
17
+ @subscriptions = subscriptions
15
18
  @broker = Broker.new(subscriptions: subscriptions, dispatcher: dispatcher)
16
19
  @clock = clock
17
20
  @metadata = Concurrent::ThreadLocalVar.new
21
+ @correlation_id_generator = correlation_id_generator
18
22
  end
19
23
 
20
24
 
21
25
  # Persists events and notifies subscribed handlers about them
22
26
  #
23
- # @param events [Array<Event, Proto>, Event, Proto] event(s)
27
+ # @param events [Array<Event>, Event] event(s)
24
28
  # @param stream_name [String] name of the stream for persisting events.
25
29
  # @param expected_version [:any, :auto, :none, Integer] controls optimistic locking strategy. {http://railseventstore.org/docs/expected_version/ Read more}
26
30
  # @return [self]
27
31
  def publish(events, stream_name: GLOBAL_STREAM, expected_version: :any)
28
32
  enriched_events = enrich_events_metadata(events)
29
- serialized_events = serialize_events(enriched_events)
30
- append_to_stream_serialized_events(serialized_events, stream_name: stream_name, expected_version: expected_version)
31
- enriched_events.zip(serialized_events) do |event, serialized_event|
33
+ records = transform(enriched_events)
34
+ append_records_to_stream(records, stream_name: stream_name, expected_version: expected_version)
35
+ enriched_events.zip(records) do |event, record|
32
36
  with_metadata(
33
- correlation_id: event.metadata[:correlation_id] || event.event_id,
37
+ correlation_id: event.metadata.fetch(:correlation_id),
34
38
  causation_id: event.event_id,
35
39
  ) do
36
- broker.(event, serialized_event)
40
+ broker.(event, record)
37
41
  end
38
42
  end
39
43
  self
@@ -44,8 +48,11 @@ module RubyEventStore
44
48
  # @param (see #publish)
45
49
  # @return [self]
46
50
  def append(events, stream_name: GLOBAL_STREAM, expected_version: :any)
47
- serialized_events = serialize_events(enrich_events_metadata(events))
48
- append_to_stream_serialized_events(serialized_events, stream_name: stream_name, expected_version: expected_version)
51
+ append_records_to_stream(
52
+ transform(enrich_events_metadata(events)),
53
+ stream_name: stream_name,
54
+ expected_version: expected_version
55
+ )
49
56
  self
50
57
  end
51
58
 
@@ -120,6 +127,14 @@ module RubyEventStore
120
127
  broker.add_global_subscription(subscriber || proc)
121
128
  end
122
129
 
130
+ # Get list of handlers subscribed to an event
131
+ #
132
+ # @param to [Class, String] type of events to get list of sybscribed handlers
133
+ # @return [Array<Object, Class>]
134
+ def subscribers_for(event_type)
135
+ subscriptions.all_for(event_type.to_s)
136
+ end
137
+
123
138
  # Builder object for collecting temporary handlers (subscribers)
124
139
  # which are active only during the invocation of the provided
125
140
  # block of code.
@@ -221,9 +236,22 @@ module RubyEventStore
221
236
  # Deserialize event which was serialized for async event handlers
222
237
  # {http://railseventstore.org/docs/subscribe/#async-handlers Read more}
223
238
  #
224
- # @return [Event, Proto] deserialized event
225
- def deserialize(event_type:, event_id:, data:, metadata:)
226
- mapper.serialized_record_to_event(SerializedRecord.new(event_type: event_type, event_id: event_id, data: data, metadata: metadata))
239
+ # @return [Event] deserialized event
240
+ def deserialize(serializer:, event_type:, event_id:, data:, metadata:, timestamp: nil, valid_at: nil)
241
+ extract_timestamp = lambda do |m|
242
+ (m[:timestamp] || Time.parse(m.fetch('timestamp'))).iso8601
243
+ end
244
+
245
+ mapper.record_to_event(
246
+ SerializedRecord.new(
247
+ event_type: event_type,
248
+ event_id: event_id,
249
+ data: data,
250
+ metadata: metadata,
251
+ timestamp: timestamp || timestamp_ = extract_timestamp[serializer.load(metadata)],
252
+ valid_at: valid_at || timestamp_,
253
+ ).deserialize(serializer)
254
+ )
227
255
  end
228
256
 
229
257
  # Read additional metadata which will be added for published events
@@ -261,12 +289,10 @@ module RubyEventStore
261
289
  # end
262
290
  # event_store.overwrite(events)
263
291
  #
264
- # @param events [Array<Event, Proto>, Event, Proto] event(s) to serialize and overwrite again
292
+ # @param events [Array<Event>, Event] event(s) to serialize and overwrite again
265
293
  # @return [self]
266
294
  def overwrite(events_or_event)
267
- events = Array(events_or_event)
268
- serialized_events = serialize_events(events)
269
- repository.update_messages(serialized_events)
295
+ repository.update_messages(transform(Array(events_or_event)))
270
296
  self
271
297
  end
272
298
 
@@ -279,10 +305,8 @@ module RubyEventStore
279
305
 
280
306
  private
281
307
 
282
- def serialize_events(events)
283
- events.map do |ev|
284
- mapper.event_to_serialized_record(ev)
285
- end
308
+ def transform(events)
309
+ events.map { |ev| mapper.event_to_record(ev) }
286
310
  end
287
311
 
288
312
  def enrich_events_metadata(events)
@@ -293,11 +317,13 @@ module RubyEventStore
293
317
 
294
318
  def enrich_event_metadata(event)
295
319
  metadata.each { |key, value| event.metadata[key] ||= value }
296
- event.metadata[:timestamp] ||= clock.call
320
+ event.metadata[:timestamp] ||= clock.call
321
+ event.metadata[:valid_at] ||= event.metadata.fetch(:timestamp)
322
+ event.metadata[:correlation_id] ||= correlation_id_generator.call
297
323
  end
298
324
 
299
- def append_to_stream_serialized_events(serialized_events, stream_name:, expected_version:)
300
- repository.append_to_stream(serialized_events, Stream.new(stream_name), ExpectedVersion.new(expected_version))
325
+ def append_records_to_stream(records, stream_name:, expected_version:)
326
+ repository.append_to_stream(records, Stream.new(stream_name), ExpectedVersion.new(expected_version))
301
327
  end
302
328
 
303
329
  protected
@@ -306,6 +332,14 @@ module RubyEventStore
306
332
  @metadata.value = value
307
333
  end
308
334
 
309
- attr_reader :repository, :mapper, :broker, :clock
335
+ def default_clock
336
+ ->{ Time.now.utc.round(TIMESTAMP_PRECISION) }
337
+ end
338
+
339
+ def default_correlation_id_generator
340
+ ->{ SecureRandom.uuid }
341
+ end
342
+
343
+ attr_reader :repository, :mapper, :subscriptions, :broker, :clock, :correlation_id_generator
310
344
  end
311
345
  end
@@ -6,10 +6,10 @@ module RubyEventStore
6
6
  @dispatchers = dispatchers
7
7
  end
8
8
 
9
- def call(subscriber, event, serialized_event)
9
+ def call(subscriber, event, record)
10
10
  @dispatchers.each do |dispatcher|
11
11
  if dispatcher.verify(subscriber)
12
- dispatcher.call(subscriber, event, serialized_event)
12
+ dispatcher.call(subscriber, event, record)
13
13
  break
14
14
  end
15
15
  end
@@ -3,4 +3,5 @@
3
3
  module RubyEventStore
4
4
  GLOBAL_STREAM = Object.new
5
5
  PAGE_SIZE = 100.freeze
6
+ TIMESTAMP_PRECISION = 6
6
7
  end
@@ -12,7 +12,6 @@ module RubyEventStore
12
12
  EventDuplicatedInStream = Class.new(Error)
13
13
  ReservedInternalName = Class.new(Error)
14
14
  InvalidHandler = Class.new(Error)
15
- ProtobufEncodingFailed = Class.new(Error)
16
15
 
17
16
  class EventNotFound < Error
18
17
  attr_reader :event_id
@@ -41,6 +41,13 @@ module RubyEventStore
41
41
  metadata[:timestamp]
42
42
  end
43
43
 
44
+ # Validity time from metadata
45
+ #
46
+ # @return [Time, nil]
47
+ def valid_at
48
+ metadata[:valid_at]
49
+ end
50
+
44
51
  # Two events are equal if:
45
52
  # * they are of the same class
46
53
  # * have identical event id
@@ -116,7 +123,7 @@ module RubyEventStore
116
123
  # on correlation_id and message_id of the provided message.
117
124
  # {http://railseventstore.org/docs/correlation_causation/ Find out more}
118
125
  #
119
- # @param other_message [Event, Proto, command] message to correlate with. Most likely an event or a command. Must respond to correlation_id and message_id.
126
+ # @param other_message [Event, command] message to correlate with. Most likely an event or a command. Must respond to correlation_id and message_id.
120
127
  # @return [String] set causation_id
121
128
  def correlate_with(other_message)
122
129
  self.correlation_id = other_message.correlation_id || other_message.message_id