Class: Myxi::EventableSocket

Inherits:
Object
  • Object
show all
Defined in:
lib/myxi/eventable_socket.rb

Direct Known Subclasses

Session

Instance Method Summary collapse

Constructor Details

#initialize(event_loop, socket) ⇒ EventableSocket

Returns a new instance of EventableSocket.



3
4
5
6
7
8
9
10
# File 'lib/myxi/eventable_socket.rb', line 3

def initialize(event_loop, socket)
  @event_loop = event_loop
  @socket = socket
  @monitor = @event_loop.selector.register(@socket, :r)
  @monitor.value = self
  @read_buffer = String.new.force_encoding('BINARY')
  @write_buffer = String.new.force_encoding('BINARY')
end

Instance Method Details

#closeObject



37
38
39
40
# File 'lib/myxi/eventable_socket.rb', line 37

def close
  @socket.close
  @event_loop.selector.deregister(@socket)
end

#close_after_writeObject



32
33
34
35
# File 'lib/myxi/eventable_socket.rb', line 32

def close_after_write
  @close_after_write = true
  @monitor.interests = :w
end

#handle_wObject



12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/myxi/eventable_socket.rb', line 12

def handle_w
  bytes_sent = @socket.write_nonblock(@write_buffer)
  # Send as much data as possible
  if bytes_sent >= @write_buffer.bytesize
    @write_buffer = String.new.force_encoding('BINARY')
    @monitor.interests = :r
    close if @close_after_write
  else
    @write_buffer.slice!(0, bytes_sent)
  end
rescue Errno::ECONNRESET, IOError
  close
end

#write(data) ⇒ Object



26
27
28
29
30
# File 'lib/myxi/eventable_socket.rb', line 26

def write(data)
  @event_loop.wakeup
  @write_buffer << data.force_encoding('BINARY')
  @monitor.interests = :rw
end