Class: Ask::Agent::Persistence::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/ask/agent/persistence/base.rb

Overview

Session persistence backed by a generic State::Adapter.

This wraps session data under namespaced keys so multiple sessions can coexist in the same state backend alongside other data.

Examples:

With the default in-memory store

store = Persistence::InMemory.new
store.save("session-1", { messages: [...] })
store.load("session-1")

With a custom state adapter (e.g. Redis)

store = Persistence::Base.new(
  state_adapter: MyRedisAdapter.new
)
store.save("session-1", data)

Direct Known Subclasses

InMemory

Constant Summary collapse

KEY_PREFIX =
"ask:session:"
INDEX_KEY =
"ask:session:index"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(state_adapter: nil) ⇒ Base

Returns a new instance of Base.

Parameters:

  • state_adapter (Ask::State::Adapter) (defaults to: nil)

    backend store (defaults to Memory)



26
27
28
# File 'lib/ask/agent/persistence/base.rb', line 26

def initialize(state_adapter: nil)
  @state = state_adapter || Ask::State::Memory.new
end

Instance Attribute Details

#stateAsk::State::Adapter (readonly)

Returns the underlying state adapter.

Returns:

  • (Ask::State::Adapter)

    the underlying state adapter



31
32
33
# File 'lib/ask/agent/persistence/base.rb', line 31

def state
  @state
end

Instance Method Details

#delete(session_id) ⇒ Object

Delete a session.

Parameters:

  • session_id (String)

    the session identifier



52
53
54
55
# File 'lib/ask/agent/persistence/base.rb', line 52

def delete(session_id)
  @state.delete(key(session_id))
  @state.list_remove(INDEX_KEY, session_id)
end

#listArray<String>

List all stored session IDs.

Returns:

  • (Array<String>)

    list of session IDs



59
60
61
# File 'lib/ask/agent/persistence/base.rb', line 59

def list
  @state.list_range(INDEX_KEY, 0, -1)
end

#load(session_id) ⇒ Hash?

Load a session.

Parameters:

  • session_id (String)

    the session identifier

Returns:

  • (Hash, nil)

    the session data, or nil if not found



46
47
48
# File 'lib/ask/agent/persistence/base.rb', line 46

def load(session_id)
  @state.get(key(session_id))
end

#save(session_id, data) ⇒ Object

Persist a session.

Parameters:

  • session_id (String)

    the session identifier

  • data (Hash)

    the session data



36
37
38
39
40
41
# File 'lib/ask/agent/persistence/base.rb', line 36

def save(session_id, data)
  @state.set(key(session_id), data)
  # Keep the index list unique — remove existing entry first then append
  @state.list_remove(INDEX_KEY, session_id)
  @state.list_append(INDEX_KEY, session_id)
end