lib/rpush/daemon/rpc/server.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'socket'
require 'singleton'

module Rpush
  module Daemon
    module Rpc
      class Server
        include Singleton
        include Loggable
        include Reflectable

        def self.start
          instance.start
        end

        def self.stop
          instance.stop
        end

        def start
          @stop = false

          @thread = Thread.new(UNIXServer.open(Rpc.socket_path)) do |server|
            begin
              loop do
                socket = server.accept
                break if @stop
                read_loop(socket)
              end

              server.close
            rescue StandardError => e
              log_error(e)
            ensure
              File.unlink(Rpc.socket_path) if File.exist?(Rpc.socket_path)
            end
          end
        end

        def stop
          @stop = true
          UNIXSocket.new(Rpc.socket_path)
          @thread.join if @thread
        rescue StandardError => e
          log_error(e)
        end

        private

        def read_loop(socket)
          loop do
            line = socket.gets
            break unless line

            begin
              cmd, args = JSON.load(line)
              log_debug("[rpc:server] #{cmd.to_sym.inspect}, args: #{args.inspect}")
              response = process(cmd, args)
              socket.puts(JSON.dump(response))
            rescue StandardError => e
              log_error(e)
              reflect(:error, e)
            end
          end

          socket.close
        end

        def process(cmd, args) # rubocop:disable Lint/UnusedMethodArgument
          case cmd
          when 'status'
            status
          end
        end

        def status
          Rpush::Daemon::AppRunner.status
        end
      end
    end
  end
end