event_store_client 0.1.4 → 0.1.5
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/README.md +14 -1
- data/lib/event_store_client/client.rb +2 -2
- data/lib/event_store_client/connection.rb +51 -14
- data/lib/event_store_client/store_adapter/api/client.rb +7 -2
- data/lib/event_store_client/store_adapter/in_memory.rb +23 -12
- data/lib/event_store_client/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7d057f39fbb77d08d7c29b5f56e38e3aee78d6b39578e472afc736ad5bbd9576
|
|
4
|
+
data.tar.gz: 3fa3ce102d2f8f6866bef59760e76fe21038ded6b1f022e78c79918753d6911b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 91d278acb0560b2b1e5166a7ef0ecdbd398f9da524dd550edc496ddc41efeb260a056a43e6e4acde752e100321fef9d6120d2eeb50047072c428f374d504a309
|
|
7
|
+
data.tar.gz: f8e821b0ff1ca1f74bcc9252d31d83f84af2722c596651ca96e923ad701b13a2a97f7537fe57b86ac97a15790987bd762507b61eb707a8c70211e9ae11c54613
|
data/README.md
CHANGED
|
@@ -57,7 +57,7 @@ class SomethingHappened < EventStoreClient::DeserializedEvent
|
|
|
57
57
|
def schema
|
|
58
58
|
Dry::Schema.Params do
|
|
59
59
|
required(:user_id).value(:string)
|
|
60
|
-
required(:
|
|
60
|
+
required(:title).value(:string)
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
63
|
end
|
|
@@ -124,6 +124,19 @@ client.publish(stream: 'newstream', events: events)
|
|
|
124
124
|
client.stop_polling
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
+
### Linking existing events to the streem
|
|
128
|
+
|
|
129
|
+
Event to be linked properly has to coantians original event id.
|
|
130
|
+
Real events could be mixed with linked events in the same stream.
|
|
131
|
+
|
|
132
|
+
```ruby
|
|
133
|
+
exisiting_event1 = client.read('newstream').last
|
|
134
|
+
client.link_to(stream: 'anotherstream', events: [exisiting_event1, ...])
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
When you read from stream where links are placed. By default Event Store Client always resolve links for you returning the event that points to the link. You can use the ES-ResolveLinkTos: false HTTP header during readin stream to tell Event Store Client to return you the actual link and to not resolve it.
|
|
138
|
+
More info: [ES-ResolveLinkTos](https://eventstore.org/docs/http-api/optional-http-headers/resolve-linkto/index.html?tabs=tabid-1%2Ctabid-3).
|
|
139
|
+
|
|
127
140
|
## Contributing
|
|
128
141
|
|
|
129
142
|
Do you want to contribute? Welcome!
|
|
@@ -10,8 +10,8 @@ module EventStoreClient
|
|
|
10
10
|
connection.publish(stream: stream, events: events, expected_version: expected_version)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def read(stream, direction: 'forward')
|
|
14
|
-
connection.read(stream, direction: direction)
|
|
13
|
+
def read(stream, direction: 'forward', start: 0, all: false)
|
|
14
|
+
connection.read(stream, direction: direction, start: start, all: all)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def subscribe(subscriber, to: [], polling: true)
|
|
@@ -10,20 +10,11 @@ module EventStoreClient
|
|
|
10
10
|
serialized_events
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def read(stream, direction
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
event = EventStoreClient::Event.new(
|
|
19
|
-
id: entry['eventId'],
|
|
20
|
-
title: entry['title'],
|
|
21
|
-
type: entry['eventType'],
|
|
22
|
-
data: entry['data'],
|
|
23
|
-
metadata: entry['metaData']
|
|
24
|
-
)
|
|
25
|
-
mapper.deserialize(event)
|
|
26
|
-
end
|
|
13
|
+
def read(stream, direction:, start:, all:, resolve_links: true)
|
|
14
|
+
return read_all_from_stream(stream, start: start, resolve_links: resolve_links) if all
|
|
15
|
+
read_from_stream(
|
|
16
|
+
stream, direction: direction, start: start, resolve_links: resolve_links
|
|
17
|
+
)
|
|
27
18
|
end
|
|
28
19
|
|
|
29
20
|
def delete_stream(stream); end
|
|
@@ -79,5 +70,51 @@ module EventStoreClient
|
|
|
79
70
|
host: host, port: port, per_page: per_page
|
|
80
71
|
)
|
|
81
72
|
end
|
|
73
|
+
|
|
74
|
+
def read_from_stream(stream, direction:, start:, resolve_links:)
|
|
75
|
+
response =
|
|
76
|
+
client.read(
|
|
77
|
+
stream, start: start, direction: direction, resolve_links: resolve_links
|
|
78
|
+
)
|
|
79
|
+
return [] if response.body.nil? || response.body.empty?
|
|
80
|
+
JSON.parse(response.body)['entries'].map do |entry|
|
|
81
|
+
deserialize_event(entry)
|
|
82
|
+
end.reverse
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def read_all_from_stream(stream, start:, resolve_links:)
|
|
86
|
+
count = per_page
|
|
87
|
+
events = []
|
|
88
|
+
failed_requests_count = 0
|
|
89
|
+
|
|
90
|
+
while failed_requests_count < 3
|
|
91
|
+
begin
|
|
92
|
+
response =
|
|
93
|
+
client.read(stream, start: start, direction: 'forward', resolve_links: resolve_links)
|
|
94
|
+
failed_requests_count += 1 && next unless response.success?
|
|
95
|
+
rescue Faraday::ConnectionFailed
|
|
96
|
+
failed_requests_count += 1
|
|
97
|
+
next
|
|
98
|
+
end
|
|
99
|
+
failed_requests_count = 0
|
|
100
|
+
break if response.body.nil? || response.body.empty?
|
|
101
|
+
entries = JSON.parse(response.body)['entries']
|
|
102
|
+
break if entries.empty?
|
|
103
|
+
events += entries.map { |entry| deserialize_event(entry) }.reverse
|
|
104
|
+
start += count
|
|
105
|
+
end
|
|
106
|
+
events
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def deserialize_event(entry)
|
|
110
|
+
event = EventStoreClient::Event.new(
|
|
111
|
+
id: entry['eventId'],
|
|
112
|
+
title: entry['title'],
|
|
113
|
+
type: entry['eventType'],
|
|
114
|
+
data: entry['data'],
|
|
115
|
+
metadata: entry['metaData']
|
|
116
|
+
)
|
|
117
|
+
mapper.deserialize(event)
|
|
118
|
+
end
|
|
82
119
|
end
|
|
83
120
|
end
|
|
@@ -24,10 +24,15 @@ module EventStoreClient
|
|
|
24
24
|
|
|
25
25
|
def read(stream_name, direction: 'forward', start: 0, count: per_page, resolve_links: true)
|
|
26
26
|
headers = {
|
|
27
|
-
'ES-ResolveLinkTos' => resolve_links.to_s
|
|
27
|
+
'ES-ResolveLinkTos' => resolve_links.to_s,
|
|
28
|
+
'Accept' => 'application/vnd.eventstore.atom+json'
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
make_request(
|
|
31
|
+
make_request(
|
|
32
|
+
:get,
|
|
33
|
+
"/streams/#{stream_name}/#{start}/#{direction}/#{count}",
|
|
34
|
+
headers: headers
|
|
35
|
+
)
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
def subscribe_to_stream(
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
module EventStoreClient
|
|
4
4
|
module StoreAdapter
|
|
5
5
|
class InMemory
|
|
6
|
+
Response = Struct.new(:body, :status) do
|
|
7
|
+
def success?
|
|
8
|
+
status == 200
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
6
12
|
attr_reader :event_store
|
|
7
13
|
|
|
8
14
|
def append_to_stream(stream_name, events, expected_version: nil) # rubocop:disable Lint/UnusedMethodArgument,Metrics/LineLength
|
|
@@ -13,16 +19,21 @@ module EventStoreClient
|
|
|
13
19
|
'eventId' => event.id,
|
|
14
20
|
'data' => event.data,
|
|
15
21
|
'eventType' => event.type,
|
|
16
|
-
'
|
|
22
|
+
'metaData' => event.metadata,
|
|
17
23
|
'positionEventNumber' => event_store[stream_name].length
|
|
18
24
|
)
|
|
19
25
|
end
|
|
20
26
|
end
|
|
21
27
|
|
|
22
|
-
def read(stream_name, direction: 'forward', start: 0,
|
|
23
|
-
|
|
28
|
+
def read(stream_name, direction: 'forward', start: 0, resolve_links: nil)
|
|
29
|
+
response =
|
|
30
|
+
if direction == 'forward'
|
|
31
|
+
read_stream_forward(stream_name, start: start)
|
|
32
|
+
else
|
|
33
|
+
read_stream_backward(stream_name, start: start)
|
|
34
|
+
end
|
|
24
35
|
|
|
25
|
-
|
|
36
|
+
Response.new(response.to_json, 200)
|
|
26
37
|
end
|
|
27
38
|
|
|
28
39
|
def delete_stream(stream_name, hard_delete: false) # rubocop:disable Lint/UnusedMethodArgument
|
|
@@ -43,32 +54,32 @@ module EventStoreClient
|
|
|
43
54
|
@event_store = {}
|
|
44
55
|
end
|
|
45
56
|
|
|
46
|
-
def read_stream_backward(stream_name, start: 0
|
|
57
|
+
def read_stream_backward(stream_name, start: 0)
|
|
47
58
|
return [] unless event_store.key?(stream_name)
|
|
48
59
|
|
|
49
|
-
start = start
|
|
50
|
-
last_index = start -
|
|
60
|
+
start = start == 'head' ? event_store[stream_name].length - 1 : start
|
|
61
|
+
last_index = start - per_page
|
|
51
62
|
entries = event_store[stream_name].select do |event|
|
|
52
63
|
event['positionEventNumber'] > last_index &&
|
|
53
64
|
event['positionEventNumber'] <= start
|
|
54
65
|
end
|
|
55
66
|
{
|
|
56
67
|
'entries' => entries,
|
|
57
|
-
'links' => links(stream_name, last_index, 'next', entries,
|
|
68
|
+
'links' => links(stream_name, last_index, 'next', entries, per_page)
|
|
58
69
|
}
|
|
59
70
|
end
|
|
60
71
|
|
|
61
|
-
def read_stream_forward(stream_name, start: 0
|
|
72
|
+
def read_stream_forward(stream_name, start: 0)
|
|
62
73
|
return [] unless event_store.key?(stream_name)
|
|
63
74
|
|
|
64
|
-
last_index = start +
|
|
65
|
-
entries = event_store[stream_name].
|
|
75
|
+
last_index = start + per_page
|
|
76
|
+
entries = event_store[stream_name].select do |event|
|
|
66
77
|
event['positionEventNumber'] < last_index &&
|
|
67
78
|
event['positionEventNumber'] >= start
|
|
68
79
|
end
|
|
69
80
|
{
|
|
70
81
|
'entries' => entries,
|
|
71
|
-
'links' => links(stream_name, last_index, 'previous', entries,
|
|
82
|
+
'links' => links(stream_name, last_index, 'previous', entries, per_page)
|
|
72
83
|
}
|
|
73
84
|
end
|
|
74
85
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: event_store_client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sebastian Wilgosz
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-02-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dry-schema
|
|
@@ -144,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
144
144
|
- !ruby/object:Gem::Version
|
|
145
145
|
version: '0'
|
|
146
146
|
requirements: []
|
|
147
|
-
rubygems_version: 3.0.
|
|
147
|
+
rubygems_version: 3.0.6
|
|
148
148
|
signing_key:
|
|
149
149
|
specification_version: 4
|
|
150
150
|
summary: Ruby integration for https://eventstore.org
|