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