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
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
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