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)

Parameters:
  • host (Host) --
def initialize(host)
  @host = host
  @mutex = Mutex.new
  @resource = ConditionVariable.new
  @stopped = true
end

def messages

Returns:
  • (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)

Returns:
  • (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

Returns:
  • (void) -
def start
  return unless @stopped
  @stopped = false
  Thread.new do
    tick until stopped?
  end
end

def stop

Returns:
  • (void) -
def stop
  @stopped = true
end

def stopped?

def stopped?
  @stopped
end

def tick

Returns:
  • (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