class EventStoreClient::InMemory
Constants
- Response
Attributes
event_store[R]
mapper[R]
per_page[R]
Public Class Methods
new(mapper:, per_page: 20)
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 77 def initialize(mapper:, per_page: 20) @per_page = per_page @mapper = mapper @event_store = {} end
Public Instance Methods
append_to_stream(stream_name, events, options: {})
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 15 def append_to_stream(stream_name, events, options: {}) # rubocop:disable Lint/UnusedMethodArgument,Metrics/LineLength event_store[stream_name] = [] unless event_store.key?(stream_name) [events].flatten.each do |event| event_store[stream_name].unshift( 'eventId' => event.id, 'data' => event.data, 'eventType' => event.type, 'metaData' => event.metadata, 'positionEventNumber' => event_store[stream_name].length ) end Dry::Monads::Success(events) end
delete_stream(stream_name, options: {})
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 29 def delete_stream(stream_name, options: {}) # rubocop:disable Lint/UnusedMethodArgument event_store.delete(stream_name) end
link_to(stream_name, events, **)
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 65 def link_to(stream_name, events, **) append_to_stream(stream_name, events) end
listen(subscription, options: {})
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 69 def listen(subscription, options: {}) # TODO: implement method body end
read(stream_name, options: {})
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 37 def read(stream_name, options: {}) start = options[:start] == 'head' ? options[:start] : options[:start].to_i direction = options[:direction] || 'forward' response = if %w[forward forwards].include?(direction) read_stream_forward(stream_name, start: start) else read_stream_backward(stream_name, start: start) end res = Response.new(response.to_json, 200) return [] if res.body.nil? || res.body.empty? skip_decryption = options[:skip_decryption] || false events = JSON.parse(res.body)['entries'].map do |entry| deserialize_event(entry, skip_decryption: skip_decryption) end.reverse Dry::Monads::Success(events) end
read_all_from_stream(stream_name, options: {})
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 57 def read_all_from_stream(stream_name, options: {}) read(stream_name, options: options) end
subscribe_to_stream(subscription, **)
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 61 def subscribe_to_stream(subscription, **) # TODO: implement method body end
tombstone_stream(stream_name, options: {})
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 33 def tombstone_stream(stream_name, options: {}) # rubocop:disable Lint/UnusedMethodArgument event_store.delete(stream_name) end
Private Instance Methods
deserialize_event(entry, skip_decryption: false)
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 132 def deserialize_event(entry, skip_decryption: false) event = EventStoreClient::Event.new( id: entry['eventId'], title: entry['title'], type: entry['eventType'], data: entry['data'].to_json || '{}', metadata: entry['isMetaData'] ? entry['metaData'] : '{}' ) mapper.deserialize(event, skip_decryption: skip_decryption) end
links(stream_name, batch_size, direction, entries, count)
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 120 def links(stream_name, batch_size, direction, entries, count) if entries.empty? || batch_size.negative? [] else [{ 'uri' => "/streams/#{stream_name}/#{batch_size}/#{direction}/#{count}", 'relation' => direction }] end end
read_stream_backward(stream_name, start: 0)
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 83 def read_stream_backward(stream_name, start: 0) response = { 'entries' => [], 'links' => [] } return response unless event_store.key?(stream_name) start = start == 'head' ? event_store[stream_name].length - 1 : start last_index = (start - per_page) response['entries'] = event_store[stream_name].select do |event| event['positionEventNumber'] > last_index && event['positionEventNumber'] <= start end response['links'] = links(stream_name, last_index, 'next', response['entries'], per_page) response end
read_stream_forward(stream_name, start: 0)
click to toggle source
# File lib/event_store_client/adapters/in_memory.rb, line 101 def read_stream_forward(stream_name, start: 0) response = { 'entries' => [], 'links' => [] } return response unless event_store.key?(stream_name) last_index = start + per_page response['entries'] = event_store[stream_name].select do |event| event['positionEventNumber'] < last_index && event['positionEventNumber'] >= start end response['links'] = links(stream_name, last_index, 'previous', response['entries'], per_page) response end