Class: ModelContextProtocol::Server::StdioTransport::RequestStore

Inherits:
Object
  • Object
show all
Defined in:
lib/model_context_protocol/server/stdio_transport/request_store.rb

Overview

Thread-safe in-memory storage for tracking active requests and their cancellation status. This store is used by StdioTransport to manage request lifecycle and handle cancellation.

Instance Method Summary collapse

Constructor Details

#initializeRequestStore

Returns a new instance of RequestStore.



6
7
8
9
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 6

def initialize
  @mutex = Mutex.new
  @requests = {}
end

Instance Method Details

#active_requestsArray<String>

Get all active request IDs

Returns:

  • (Array<String>)

    list of active request IDs



73
74
75
76
77
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 73

def active_requests
  @mutex.synchronize do
    @requests.keys.dup
  end
end

#cancelled?(request_id) ⇒ Boolean

Check if a request has been cancelled

Parameters:

  • request_id (String)

    the unique request identifier

Returns:

  • (Boolean)

    true if the request is cancelled, false otherwise



44
45
46
47
48
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 44

def cancelled?(request_id)
  @mutex.synchronize do
    @requests[request_id]&.fetch(:cancelled, false) || false
  end
end

#cleanup_old_requests(max_age_seconds = 300) ⇒ Array<String>

Clean up old requests (useful for preventing memory leaks)

Parameters:

  • max_age_seconds (Integer) (defaults to: 300)

    maximum age of requests to keep

Returns:

  • (Array<String>)

    list of cleaned up request IDs



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 83

def cleanup_old_requests(max_age_seconds = 300)
  cutoff_time = Time.now - max_age_seconds
  removed_ids = []

  @mutex.synchronize do
    @requests.delete_if do |request_id, data|
      if data[:started_at] < cutoff_time
        removed_ids << request_id
        true
      else
        false
      end
    end
  end

  removed_ids
end

#get_request(request_id) ⇒ Hash?

Get information about a specific request

Parameters:

  • request_id (String)

    the unique request identifier

Returns:

  • (Hash, nil)

    request information or nil if not found



64
65
66
67
68
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 64

def get_request(request_id)
  @mutex.synchronize do
    @requests[request_id]&.dup
  end
end

#mark_cancelled(request_id) ⇒ Boolean

Mark a request as cancelled

Parameters:

  • request_id (String)

    the unique request identifier

Returns:

  • (Boolean)

    true if request was found and marked cancelled, false otherwise



30
31
32
33
34
35
36
37
38
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 30

def mark_cancelled(request_id)
  @mutex.synchronize do
    if (request = @requests[request_id])
      request[:cancelled] = true
      return true
    end
    false
  end
end

#register_request(request_id, thread = Thread.current) ⇒ void

This method returns an undefined value.

Register a new request with its associated thread

Parameters:

  • request_id (String)

    the unique request identifier

  • thread (Thread) (defaults to: Thread.current)

    the thread processing this request (defaults to current thread)



16
17
18
19
20
21
22
23
24
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 16

def register_request(request_id, thread = Thread.current)
  @mutex.synchronize do
    @requests[request_id] = {
      thread:,
      cancelled: false,
      started_at: Time.now
    }
  end
end

#unregister_request(request_id) ⇒ Hash?

Unregister a request (typically called when request completes)

Parameters:

  • request_id (String)

    the unique request identifier

Returns:

  • (Hash, nil)

    the removed request data, or nil if not found



54
55
56
57
58
# File 'lib/model_context_protocol/server/stdio_transport/request_store.rb', line 54

def unregister_request(request_id)
  @mutex.synchronize do
    @requests.delete(request_id)
  end
end