Sha256: a5a2ac164314375a6e55b6c649f474da7600d2aa06f9c38ead70b1c9a2e0d783

Contents?: true

Size: 1.79 KB

Versions: 2

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true

require 'socket'
require 'securerandom'

#
# This code is based on https://github.com/fohte/rubocop-daemon.
#
# Copyright (c) 2018 Hayato Kawai
#
# The MIT License (MIT)
#
# https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
#
module RuboCop
  module Server
    # The core of server process. It starts TCP server and perform socket communication.
    # @api private
    class Core
      def self.token
        @token ||= SecureRandom.hex(4)
      end

      def token
        self.class.token
      end

      def start(host, port)
        $PROGRAM_NAME = "rubocop --server #{Cache.project_dir}"

        require 'rubocop'
        start_server(host, port)

        demonize if server_mode?
      end

      private

      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

      def server_mode?
        true
      end

      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

      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
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rubocop-1.37.1 lib/rubocop/server/core.rb
rubocop-1.37.0 lib/rubocop/server/core.rb