lib/rpush/daemon/rpc/server.rb
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