Class: VectorMCP::Transport::HttpStream::EventStore Private

Inherits:
Object
  • Object
show all
Defined in:
lib/vector_mcp/transport/http_stream/event_store.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Manages Server-Sent Events storage for resumable connections.

Handles:

  • Event storage with unique IDs

  • Event replay from a specific Last-Event-ID

  • Circular buffer for memory efficiency

  • Thread-safe operations

Defined Under Namespace

Classes: Event

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(max_events) ⇒ EventStore

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initializes a new event store.

Parameters:

  • max_events (Integer)

    Maximum number of events to retain



36
37
38
39
40
41
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 36

def initialize(max_events)
  @max_events = max_events
  @events = Concurrent::Array.new
  @event_index = Concurrent::Hash.new # event_id -> index for fast lookup
  @current_sequence = Concurrent::AtomicFixnum.new(0)
end

Instance Attribute Details

#loggerObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



31
32
33
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 31

def logger
  @logger
end

#max_eventsObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



31
32
33
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 31

def max_events
  @max_events
end

Instance Method Details

#clearvoid

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.

Clears all stored events.



121
122
123
124
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 121

def clear
  @events.clear
  @event_index.clear
end

#event_countInteger

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Gets the total number of stored events.

Returns:

  • (Integer)

    Number of events currently stored



92
93
94
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 92

def event_count
  @events.length
end

#event_exists?(event_id) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Checks if an event ID exists in the store.

Parameters:

  • event_id (String)

    The event ID to check

Returns:

  • (Boolean)

    True if event exists



114
115
116
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 114

def event_exists?(event_id)
  @event_index.key?(event_id)
end

#get_events_after(last_event_id) ⇒ Array<Event>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Retrieves events starting from a specific event ID.

Parameters:

  • last_event_id (String)

    The last event ID received by client

Returns:

  • (Array<Event>)

    Array of events after the specified ID



76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 76

def get_events_after(last_event_id)
  return @events.to_a if last_event_id.nil?

  last_index = @event_index[last_event_id]
  return [] if last_index.nil?

  # Return events after the last_event_id
  start_index = last_index + 1
  return [] if start_index >= @events.length

  @events[start_index..]
end

#newest_event_idString?

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Gets the newest event ID (for debugging/monitoring).

Returns:

  • (String, nil)

    The newest event ID or nil if no events



106
107
108
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 106

def newest_event_id
  @events.last&.id
end

#oldest_event_idString?

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Gets the oldest event ID (for debugging/monitoring).

Returns:

  • (String, nil)

    The oldest event ID or nil if no events



99
100
101
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 99

def oldest_event_id
  @events.first&.id
end

#statsHash

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Gets statistics about the event store.

Returns:

  • (Hash)

    Statistics hash



129
130
131
132
133
134
135
136
137
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 129

def stats
  {
    total_events: event_count,
    max_events: @max_events,
    oldest_event_id: oldest_event_id,
    newest_event_id: newest_event_id,
    memory_usage_ratio: event_count.to_f / @max_events
  }
end

#store_event(data, type = nil) ⇒ String

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Stores a new event and returns its ID.

Parameters:

  • data (String)

    The event data

  • type (String) (defaults to: nil)

    The event type (optional)

Returns:

  • (String)

    The generated event ID



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/vector_mcp/transport/http_stream/event_store.rb', line 48

def store_event(data, type = nil)
  event_id = generate_event_id
  timestamp = Time.now

  event = Event.new(event_id, data, type, timestamp)

  # Add to events array
  @events.push(event)

  # Update index
  @event_index[event_id] = @events.length - 1

  # Maintain circular buffer
  if @events.length > @max_events
    removed_event = @events.shift
    @event_index.delete(removed_event.id)

    # Update all indices after removal
    @event_index.transform_values! { |index| index - 1 }
  end

  event_id
end