ruby_event_store 0.38.1 → 0.39.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.
- checksums.yaml +4 -4
- data/Gemfile +4 -2
- data/Makefile +9 -6
- data/lib/ruby_event_store/in_memory_repository.rb +1 -1
- data/lib/ruby_event_store/mappers/encryption_mapper.rb +30 -3
- data/lib/ruby_event_store/mappers/null_mapper.rb +17 -4
- data/lib/ruby_event_store/projection.rb +14 -7
- data/lib/ruby_event_store/serialized_record.rb +1 -1
- data/lib/ruby_event_store/spec/event_repository_lint.rb +0 -2
- data/lib/ruby_event_store/spec/mapper_lint.rb +17 -0
- data/lib/ruby_event_store/specification.rb +3 -15
- data/lib/ruby_event_store/specification_result.rb +3 -11
- data/lib/ruby_event_store/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93c4fb13b69f6c54171be328e0bb2f10ad9172afbad3b367762a831754523700
|
4
|
+
data.tar.gz: e3ee2f58ed04b5df00c2e44685b9f6d1172fce73f8df639d35bae021930af3ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fd6b0a07e06ec3faf668a57e7564c8d151b567d0b24e07097042a29032ec9e598d430a9107c64d581dcb83f89a4ea52420798ee6039e7b08da5d417db337ef7
|
7
|
+
data.tar.gz: e7426bddb8d654198b340c7aba9d882cb2296bf379dab83dd6182cb824ff3fd3f2839cdc17f2ddd8d3bd4a5f0846cf38c82fa29d9925bc7cc0dac4852fcf9677
|
data/Gemfile
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
3
|
+
|
2
4
|
gemspec
|
3
5
|
|
4
|
-
eval_gemfile File.expand_path('../
|
6
|
+
eval_gemfile File.expand_path('../support/bundler/Gemfile.shared', __dir__)
|
5
7
|
|
6
8
|
gem 'protobuf_nested_struct'
|
7
|
-
gem 'google-protobuf', '
|
9
|
+
gem 'google-protobuf', '~> 3.7.0'
|
8
10
|
gem 'activesupport', '~> 5.0'
|
data/Makefile
CHANGED
@@ -7,12 +7,15 @@ IGNORE = RubyEventStore::InMemoryRepository\#append_with_synchronize \
|
|
7
7
|
RubyEventStore::Client::Within\#call \
|
8
8
|
RubyEventStore::Mappers::InMemoryEncryptionKeyRepository\#prepare_encrypt \
|
9
9
|
RubyEventStore::Mappers::EncryptionKey\#prepare_encrypt \
|
10
|
-
RubyEventStore::Mappers::EncryptionKey\#prepare_decrypt
|
10
|
+
RubyEventStore::Mappers::EncryptionKey\#prepare_decrypt \
|
11
|
+
RubyEventStore::Mappers::EncryptionKey\#prepare_auth_data \
|
12
|
+
RubyEventStore::Mappers::EncryptionKey\#encrypt_authenticated \
|
13
|
+
RubyEventStore::Mappers::EncryptionKey\#ciphertext_from_authenticated
|
11
14
|
|
12
15
|
SUBJECT ?= RubyEventStore*
|
13
16
|
|
14
|
-
include ../
|
15
|
-
include ../
|
16
|
-
include ../
|
17
|
-
include ../
|
18
|
-
include ../
|
17
|
+
include ../support/make/install.mk
|
18
|
+
include ../support/make/test.mk
|
19
|
+
include ../support/make/mutant.mk
|
20
|
+
include ../support/make/gem.mk
|
21
|
+
include ../support/make/help.mk
|
@@ -72,7 +72,7 @@ module RubyEventStore
|
|
72
72
|
events = events.select{|e| spec.with_ids.any?{|x| x.eql?(e.event_id)}} if spec.with_ids?
|
73
73
|
events = events.select{|e| spec.with_types.any?{|x| x.eql?(e.event_type)}} if spec.with_types?
|
74
74
|
events = events.reverse if spec.backward?
|
75
|
-
events = events.drop(index_of(events, spec.start) + 1)
|
75
|
+
events = events.drop(index_of(events, spec.start) + 1) if spec.start
|
76
76
|
events = events.take(index_of(events, spec.stop)) if spec.stop
|
77
77
|
events = events[0...spec.limit] if spec.limit?
|
78
78
|
events
|
@@ -25,7 +25,7 @@ module RubyEventStore
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class InMemoryEncryptionKeyRepository
|
28
|
-
DEFAULT_CIPHER = 'aes-256-
|
28
|
+
DEFAULT_CIPHER = 'aes-256-gcm'.freeze
|
29
29
|
|
30
30
|
def initialize
|
31
31
|
@keys = {}
|
@@ -63,14 +63,25 @@ module RubyEventStore
|
|
63
63
|
crypto = prepare_encrypt(cipher)
|
64
64
|
crypto.iv = iv
|
65
65
|
crypto.key = key
|
66
|
-
|
66
|
+
|
67
|
+
if crypto.authenticated?
|
68
|
+
encrypt_authenticated(crypto, message)
|
69
|
+
else
|
70
|
+
crypto.update(message) + crypto.final
|
71
|
+
end
|
67
72
|
end
|
68
73
|
|
69
74
|
def decrypt(message, iv)
|
70
75
|
crypto = prepare_decrypt(cipher)
|
71
76
|
crypto.iv = iv
|
72
77
|
crypto.key = key
|
73
|
-
|
78
|
+
ciphertext =
|
79
|
+
if crypto.authenticated?
|
80
|
+
ciphertext_from_authenticated(crypto, message)
|
81
|
+
else
|
82
|
+
message
|
83
|
+
end
|
84
|
+
(crypto.update(ciphertext) + crypto.final).force_encoding("UTF-8")
|
74
85
|
end
|
75
86
|
|
76
87
|
def random_iv
|
@@ -82,6 +93,22 @@ module RubyEventStore
|
|
82
93
|
|
83
94
|
private
|
84
95
|
|
96
|
+
def ciphertext_from_authenticated(crypto, message)
|
97
|
+
prepare_auth_data(crypto)
|
98
|
+
crypto.auth_tag = message[-16...message.length]
|
99
|
+
message[0...-16]
|
100
|
+
end
|
101
|
+
|
102
|
+
def encrypt_authenticated(crypto, message)
|
103
|
+
prepare_auth_data(crypto)
|
104
|
+
crypto.update(message) + crypto.final + crypto.auth_tag
|
105
|
+
end
|
106
|
+
|
107
|
+
def prepare_auth_data(crypto)
|
108
|
+
crypto.auth_data = ""
|
109
|
+
crypto
|
110
|
+
end
|
111
|
+
|
85
112
|
def prepare_encrypt(cipher)
|
86
113
|
crypto = OpenSSL::Cipher.new(cipher)
|
87
114
|
crypto.encrypt
|
@@ -1,13 +1,26 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module RubyEventStore
|
2
4
|
module Mappers
|
3
5
|
class NullMapper
|
4
|
-
|
5
|
-
|
6
|
+
extend Forwardable
|
7
|
+
class NULL
|
8
|
+
def self.dump(event)
|
9
|
+
event
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.load(record)
|
13
|
+
record
|
14
|
+
end
|
6
15
|
end
|
16
|
+
private_constant :NULL
|
7
17
|
|
8
|
-
|
9
|
-
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@mapper = Default.new(serializer: NULL)
|
10
21
|
end
|
22
|
+
|
23
|
+
def_delegators :@mapper, :event_to_serialized_record, :serialized_record_to_event
|
11
24
|
end
|
12
25
|
end
|
13
26
|
end
|
@@ -49,7 +49,7 @@ module RubyEventStore
|
|
49
49
|
handlers.keys
|
50
50
|
end
|
51
51
|
|
52
|
-
def run(event_store, start:
|
52
|
+
def run(event_store, start: nil, count: PAGE_SIZE)
|
53
53
|
if streams.any?
|
54
54
|
reduce_from_streams(event_store, start, count)
|
55
55
|
else
|
@@ -60,7 +60,7 @@ module RubyEventStore
|
|
60
60
|
private
|
61
61
|
|
62
62
|
def valid_starting_point?(start)
|
63
|
-
return true
|
63
|
+
return true unless start
|
64
64
|
if streams.any?
|
65
65
|
(start.instance_of?(Array) && start.size === streams.size)
|
66
66
|
else
|
@@ -69,19 +69,26 @@ module RubyEventStore
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def reduce_from_streams(event_store, start, count)
|
72
|
-
raise ArgumentError.new('Start must be an array with event ids
|
72
|
+
raise ArgumentError.new('Start must be an array with event ids') unless valid_starting_point?(start)
|
73
73
|
streams.zip(start_events(start)).reduce(initial_state) do |state, (stream_name, start_event_id)|
|
74
|
-
event_store
|
74
|
+
read_scope(event_store, stream_name, count, start_event_id).reduce(state, &method(:transition))
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
def reduce_from_all_streams(event_store, start, count)
|
79
|
-
raise ArgumentError.new('Start must be valid event id
|
80
|
-
event_store
|
79
|
+
raise ArgumentError.new('Start must be valid event id') unless valid_starting_point?(start)
|
80
|
+
read_scope(event_store, nil, count, start).reduce(initial_state, &method(:transition))
|
81
|
+
end
|
82
|
+
|
83
|
+
def read_scope(event_store, stream, count, start)
|
84
|
+
scope = event_store.read.in_batches(count)
|
85
|
+
scope = scope.stream(stream) if stream
|
86
|
+
scope = scope.from(start) if start
|
87
|
+
scope
|
81
88
|
end
|
82
89
|
|
83
90
|
def start_events(start)
|
84
|
-
start
|
91
|
+
start ? start : Array.new
|
85
92
|
end
|
86
93
|
|
87
94
|
def transition(state, event)
|
@@ -2,7 +2,7 @@ module RubyEventStore
|
|
2
2
|
class SerializedRecord
|
3
3
|
StringsRequired = Class.new(StandardError)
|
4
4
|
def initialize(event_id:, data:, metadata:, event_type:)
|
5
|
-
raise StringsRequired unless [event_id,
|
5
|
+
raise StringsRequired unless [event_id, event_type].all? { |v| v.instance_of?(String) }
|
6
6
|
@event_id = event_id
|
7
7
|
@data = data
|
8
8
|
@metadata = metadata
|
@@ -1212,9 +1212,7 @@ module RubyEventStore
|
|
1212
1212
|
expect(repository.count(specification.stream('not-existing-stream').result)).to eq(0)
|
1213
1213
|
|
1214
1214
|
repository.append_to_stream([SRecord.new(event_type: Type1.to_s)], dummy, version_any)
|
1215
|
-
expect(repository.count(specification.from(:head).result)).to eq(5)
|
1216
1215
|
expect(repository.count(specification.from(event_id).result)).to eq(1)
|
1217
|
-
expect(repository.count(specification.stream("Dummy").from(:head).result)).to eq(2)
|
1218
1216
|
expect(repository.count(specification.stream("Dummy").from(event_id).result)).to eq(1)
|
1219
1217
|
expect(repository.count(specification.stream("Dummy").to(event_id).result)).to eq(0)
|
1220
1218
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module RubyEventStore
|
2
|
+
RSpec.shared_examples :mapper do |mapper, domain_event|
|
3
|
+
specify "event_to_serialized_record returns instance of SerializedRecord" do
|
4
|
+
record = mapper.event_to_serialized_record(domain_event)
|
5
|
+
|
6
|
+
expect(record).to be_kind_of(SerializedRecord)
|
7
|
+
expect(record.event_id).to eq(domain_event.event_id)
|
8
|
+
expect(record.event_type).to eq(domain_event.type)
|
9
|
+
end
|
10
|
+
|
11
|
+
specify "serialize and deserialize gives equal event" do
|
12
|
+
record = mapper.event_to_serialized_record(domain_event)
|
13
|
+
|
14
|
+
expect(mapper.serialized_record_to_event(record)).to eq(domain_event)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -22,23 +22,11 @@ module RubyEventStore
|
|
22
22
|
# Limits the query to events before or after another event.
|
23
23
|
# {http://railseventstore.org/docs/read/ Find out more}.
|
24
24
|
#
|
25
|
-
# @param start [
|
26
|
-
# :head can mean the beginning or end of the stream, depending on the
|
27
|
-
# #direction
|
25
|
+
# @param start [String] id of event to start reading from.
|
28
26
|
# @return [Specification]
|
29
27
|
def from(start)
|
30
|
-
if start.
|
31
|
-
|
32
|
-
`:head` has been deprecated. Use event_id or skip from instead.
|
33
|
-
EOW
|
34
|
-
end
|
35
|
-
case start
|
36
|
-
when Symbol
|
37
|
-
raise InvalidPageStart unless start.equal?(:head)
|
38
|
-
else
|
39
|
-
raise InvalidPageStart if start.nil? || start.empty?
|
40
|
-
raise EventNotFound.new(start) unless reader.has_event?(start)
|
41
|
-
end
|
28
|
+
raise InvalidPageStart if start.nil? || start.empty?
|
29
|
+
raise EventNotFound.new(start) unless reader.has_event?(start)
|
42
30
|
Specification.new(reader, result.dup { |r| r.start = start })
|
43
31
|
end
|
44
32
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module RubyEventStore
|
2
2
|
class SpecificationResult
|
3
3
|
def initialize(direction: :forward,
|
4
|
-
start:
|
4
|
+
start: nil,
|
5
5
|
stop: nil,
|
6
6
|
count: nil,
|
7
7
|
stream: Stream.new(GLOBAL_STREAM),
|
@@ -38,18 +38,10 @@ module RubyEventStore
|
|
38
38
|
attributes.stream
|
39
39
|
end
|
40
40
|
|
41
|
-
# Starting position.
|
41
|
+
# Starting position. Event id of starting event
|
42
42
|
# {http://railseventstore.org/docs/read/ Find out more}.
|
43
43
|
#
|
44
|
-
# @return [
|
45
|
-
def head?
|
46
|
-
start.equal?(:head)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Starting position. Event id of starting event or :head
|
50
|
-
# {http://railseventstore.org/docs/read/ Find out more}.
|
51
|
-
#
|
52
|
-
# @return [String|Symbol]
|
44
|
+
# @return [String]
|
53
45
|
def start
|
54
46
|
attributes.start
|
55
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_event_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.39.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arkency
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- lib/ruby_event_store/spec/dispatcher_lint.rb
|
65
65
|
- lib/ruby_event_store/spec/event_lint.rb
|
66
66
|
- lib/ruby_event_store/spec/event_repository_lint.rb
|
67
|
+
- lib/ruby_event_store/spec/mapper_lint.rb
|
67
68
|
- lib/ruby_event_store/spec/scheduler_lint.rb
|
68
69
|
- lib/ruby_event_store/spec/subscriptions_lint.rb
|
69
70
|
- lib/ruby_event_store/specification.rb
|
@@ -96,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
97
|
- !ruby/object:Gem::Version
|
97
98
|
version: '0'
|
98
99
|
requirements: []
|
99
|
-
rubygems_version: 3.0.
|
100
|
+
rubygems_version: 3.0.3
|
100
101
|
signing_key:
|
101
102
|
specification_version: 4
|
102
103
|
summary: Event Store in Ruby
|