class Flic::Protocol::Connection

A wrapper around a socket that allows sending/receiving commands/events

Attributes

socket[R]

@return [Socket] the underlying socket

Public Class Methods

new(socket) click to toggle source
# File lib/flic/protocol/connection.rb, line 13
def initialize(socket)
  @socket = socket
  @read_semaphore = Mutex.new
  @write_semaphore = Mutex.new
end

Public Instance Methods

recv_command() click to toggle source

Receives a command from the socket @note This method may block @return [Flic::Protocol::Commands::Command]

# File lib/flic/protocol/connection.rb, line 28
def recv_command
  Protocol.parse_command(recv_packet)
end
recv_event() click to toggle source

Receives an event from the socket @note This method may block @return [Flic::Protocol::Events::Event]

# File lib/flic/protocol/connection.rb, line 41
def recv_event
  Protocol.parse_event(recv_packet)
end
send_command(command) click to toggle source

Sends a command over the socket @param command [Flic::Protocol::Commands::Command]

# File lib/flic/protocol/connection.rb, line 21
def send_command(command)
  send_packet Protocol.serialize_command(command)
end
send_event(event) click to toggle source

Sends an event over the socket @param event [Flic::Protocol::Events::Event]

# File lib/flic/protocol/connection.rb, line 34
def send_event(event)
  send_packet Protocol.serialize_event(event)
end

Private Instance Methods

recv_packet() click to toggle source
# File lib/flic/protocol/connection.rb, line 61
def recv_packet
  @read_semaphore.synchronize do
    packet_header = Protocol::PacketHeader.new
    packet_header_bytes = @socket.read packet_header.num_bytes

    raise UnexpectedNilReturnValueFromRead unless packet_header_bytes

    packet_header.read(packet_header_bytes)

    @socket.read(packet_header.byte_length)
  end
rescue UnexpectedNilReturnValueFromRead
  @socket.close
  retry
rescue RuntimeError, IOError
  if @socket.closed?
    raise UnderlyingSocketClosedError
  else
    raise
  end
end
send_packet(payload) click to toggle source
# File lib/flic/protocol/connection.rb, line 47
def send_packet(payload)
  @write_semaphore.synchronize do
    packet_header = Protocol::PacketHeader.new(byte_length: payload.bytesize)
    @socket.write(packet_header.to_binary_s)
    @socket.write(payload)
  end
rescue RuntimeError, IOError
  if @socket.closed?
    raise UnderlyingSocketClosedError
  else
    raise
  end
end