Class: Llmemory::ShortTerm::Stores::MemoryStore

Inherits:
Base
  • Object
show all
Defined in:
lib/llmemory/short_term/stores/memory_store.rb

Instance Method Summary collapse

Constructor Details

#initialize(cipher: nil) ⇒ MemoryStore

Returns a new instance of MemoryStore.



11
12
13
14
# File 'lib/llmemory/short_term/stores/memory_store.rb', line 11

def initialize(cipher: nil)
  @store = {}
  @mutexes = Hash.new { |h, k| h[k] = Mutex.new }
end

Instance Method Details

#delete(user_id, session_id) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/llmemory/short_term/stores/memory_store.rb', line 31

def delete(user_id, session_id)
  key = key_for(user_id, session_id)
  @mutexes[key].synchronize do
    @store.delete(key)
  end
  true
end

#list_sessions(user_id:) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/llmemory/short_term/stores/memory_store.rb', line 55

def list_sessions(user_id:)
  encoded_user = KeyCodec.encode(user_id)
  prefix = "#{encoded_user}#{KeyCodec::SEPARATOR}"
  @store.keys
    .select { |k| k.start_with?(prefix) }
    .map { |k| KeyCodec.split_composite_key(k, parts: 2).last }
end

#list_usersObject



51
52
53
# File 'lib/llmemory/short_term/stores/memory_store.rb', line 51

def list_users
  @store.keys.map { |k| KeyCodec.split_composite_key(k, parts: 2).first }.uniq
end

#load(user_id, session_id) ⇒ Object



24
25
26
27
28
29
# File 'lib/llmemory/short_term/stores/memory_store.rb', line 24

def load(user_id, session_id)
  key = key_for(user_id, session_id)
  @mutexes[key].synchronize do
    deep_copy(@store.dig(key, :state))
  end
end

#save(user_id, session_id, state) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/llmemory/short_term/stores/memory_store.rb', line 16

def save(user_id, session_id, state)
  key = key_for(user_id, session_id)
  @mutexes[key].synchronize do
    @store[key] = { state: deep_copy(state), updated_at: Time.now }
  end
  true
end

#update(user_id, session_id, &block) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/llmemory/short_term/stores/memory_store.rb', line 39

def update(user_id, session_id, &block)
  key = key_for(user_id, session_id)
  @mutexes[key].synchronize do
    current = deep_copy(@store.dig(key, :state))
    new_state = yield(current)
    unless new_state.nil?
      @store[key] = { state: deep_copy(new_state), updated_at: Time.now }
    end
    deep_copy(new_state)
  end
end