class Solargraph::LanguageServer::Host::MessageWorker
A serial worker Thread to handle incoming messages.
def cancel_message
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
def initialize(host)
-
host
(Host
) --
def initialize(host) @host = host @mutex = Mutex.new @resource = ConditionVariable.new @stopped = true end
def messages
-
(Array
-)
def messages @messages ||= [] end
def next_message
def next_message cancel_message || next_priority end
def next_priority
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 return messages.shift unless idx msg = messages[idx] messages.delete_at idx msg end
def queue(message)
-
(void)
-
Parameters:
-
message
(Hash
) -- The message to handle. Will be forwarded to Host#receive
def queue(message) @mutex.synchronize do messages.push(message) @resource.signal end end
def start
-
(void)
-
def start return unless @stopped @stopped = false Thread.new do tick until stopped? end end
def stop
-
(void)
-
def stop @stopped = true end
def stopped?
def stopped? @stopped end
def tick
-
(void)
-
def tick message = @mutex.synchronize do @resource.wait(@mutex) if messages.empty? next_message end handler = @host.receive(message) handler&.send_response end
def version_dependent? msg
order to work correctly.
True if the message requires a previous update to have executed in
def version_dependent? msg msg['textDocument'] && msg['position'] end