Module: ModelContextProtocol::Server::Cancellable
Defined Under Namespace
Classes: CancellationError
Instance Method Summary collapse
-
#cancellable(interval: 0.1) { ... } ⇒ Object
Execute a block with automatic cancellation support for blocking I/O operations.
Instance Method Details
#cancellable(interval: 0.1) { ... } ⇒ Object
Execute a block with automatic cancellation support for blocking I/O operations. This method uses Concurrent::TimerTask to poll for cancellation every 100ms and can interrupt even blocking operations like HTTP requests or database queries.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/model_context_protocol/server/cancellable.rb', line 22 def cancellable(interval: 0.1, &block) context = Thread.current[:mcp_context] executing_thread = Concurrent::AtomicReference.new(nil) timer_task = Concurrent::TimerTask.new(execution_interval: interval) do if context && context[:request_store] && context[:request_id] if context[:request_store].cancelled?(context[:request_id]) thread = executing_thread.get thread&.raise(CancellationError, "Request was cancelled") if thread&.alive? end end end begin executing_thread.set(Thread.current) if context && context[:request_store] && context[:request_id] if context[:request_store].cancelled?(context[:request_id]) raise CancellationError, "Request #{context[:request_id]} was cancelled" end end timer_task.execute result = block.call result ensure executing_thread.set(nil) timer_task&.shutdown if timer_task&.running? end end |