class Solargraph::LanguageServer::Host::MessageWorker
A serial worker Thread to handle incoming messages.
Constants
- UPDATE_METHODS
Public Class Methods
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 23 def initialize(host) @host = host @mutex = Mutex.new @resource = ConditionVariable.new @stopped = true end
@param host [Host]
Public Instance Methods
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 32 def messages @messages ||= [] end
pending handle messages @return [Array<Hash>]
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 47 def queue(message) @mutex.synchronize do messages.push(message) @resource.signal end end
@param message [Hash] The message to handle. Will be forwarded to Host#receive @return [void]
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 55 def start return unless @stopped @stopped = false Thread.new do tick until stopped? end end
@return [void]
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 41 def stop @stopped = true end
@return [void]
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 36 def stopped? @stopped end
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 64 def tick message = @mutex.synchronize do @resource.wait(@mutex) if messages.empty? next_message end handler = @host.receive(message) handler&.send_response end
@return [void]
Private Instance Methods
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 81 def cancel_message # Handle cancellations first idx = messages.find_index { |msg| msg['method'] == '$/cancelRequest' } return unless idx msg = messages[idx] messages.delete_at idx msg end
@return [Hash, nil]
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 76 def next_message cancel_message || next_priority end
@return [Hash, nil]
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 92 def next_priority # Prioritize updates and version-dependent messages for performance idx = messages.find_index do |msg| UPDATE_METHODS.include?(msg['method']) || version_dependent?(msg) end idx ? messages.delete_at(idx) : messages.shift end
@return [Hash, nil]
Source
# File lib/solargraph/language_server/host/message_worker.rb, line 106 def version_dependent? msg msg['textDocument'] && msg['position'] end
True if the message requires a previous update to have executed in order to work correctly.
@param msg [Hash{String => Object}] @todo need boolish type from RBS @return [Object]