class RuboCop::Server::Core

The core of server process. It starts TCP server and perform socket communication. @api private

Public Class Methods

token() click to toggle source
# File lib/rubocop/server/core.rb, line 20
def self.token
  @token ||= SecureRandom.hex(4)
end

Public Instance Methods

start(host, port) click to toggle source
# File lib/rubocop/server/core.rb, line 28
def start(host, port)
  $PROGRAM_NAME = "rubocop --server #{Cache.project_dir}"

  require 'rubocop'
  start_server(host, port)

  demonize if server_mode?
end
token() click to toggle source
# File lib/rubocop/server/core.rb, line 24
def token
  self.class.token
end

Private Instance Methods

demonize() click to toggle source
# File lib/rubocop/server/core.rb, line 39
def demonize
  Cache.write_port_and_token_files(port: @server.addr[1], token: token)

  pid = fork do
    Process.daemon(true)
    Cache.write_pid_file do
      read_socket(@server.accept) until @server.closed?
    end
  end

  Process.waitpid(pid)
end
read_socket(socket) click to toggle source
# File lib/rubocop/server/core.rb, line 63
def read_socket(socket)
  SocketReader.new(socket).read!
rescue InvalidTokenError
  socket.puts 'token is not valid.'
rescue ServerStopRequest
  @server.close
rescue UnknownServerCommandError => e
  socket.puts e.message
rescue Errno::EPIPE => e
  warn e.inspect
rescue StandardError => e
  socket.puts e.full_message
ensure
  socket.close
end
server_mode?() click to toggle source
# File lib/rubocop/server/core.rb, line 52
def server_mode?
  true
end
start_server(host, port) click to toggle source
# File lib/rubocop/server/core.rb, line 56
def start_server(host, port)
  @server = TCPServer.open(host, port)

  output_stream = ARGV.include?('--stderr') ? $stderr : $stdout
  output_stream.puts "RuboCop server starting on #{@server.addr[3]}:#{@server.addr[1]}."
end