Class: Faye::RackStream

Inherits:
Object
  • Object
show all
Includes:
EventMachine::Deferrable
Defined in:
lib/faye/rack_stream.rb

Direct Known Subclasses

EventSource::Stream, WebSocket::Stream

Defined Under Namespace

Modules: Reader

Instance Method Summary collapse

Constructor Details

#initialize(socket_object) ⇒ RackStream

Returns a new instance of RackStream.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/faye/rack_stream.rb', line 18

def initialize(socket_object)
  @socket_object = socket_object
  @connection    = socket_object.env['em.connection']
  @stream_send   = socket_object.env['stream.send']

  if socket_object.env['rack.hijack']
    socket_object.env['rack.hijack'].call
    @rack_hijack_io = socket_object.env['rack.hijack_io']
    EventMachine.attach(@rack_hijack_io, Reader) do |reader|
      @rack_hijack_io_reader = reader
      reader.stream = self
    end
  end

  @connection.socket_stream = self if @connection.respond_to?(:socket_stream)
end

Instance Method Details

#clean_rack_hijackObject



35
36
37
38
39
# File 'lib/faye/rack_stream.rb', line 35

def clean_rack_hijack
  return unless @rack_hijack_io
  @rack_hijack_io_reader.close_connection_after_writing
  @rack_hijack_io = @rack_hijack_io_reader = nil
end

#close_connectionObject



41
42
43
44
# File 'lib/faye/rack_stream.rb', line 41

def close_connection
  clean_rack_hijack
  @connection.close_connection if @connection
end

#close_connection_after_writingObject



46
47
48
49
# File 'lib/faye/rack_stream.rb', line 46

def close_connection_after_writing
  clean_rack_hijack
  @connection.close_connection_after_writing if @connection
end

#each(&callback) ⇒ Object



51
52
53
# File 'lib/faye/rack_stream.rb', line 51

def each(&callback)
  @stream_send ||= callback
end

#failObject



55
56
# File 'lib/faye/rack_stream.rb', line 55

def fail
end

#receive(data) ⇒ Object



58
59
# File 'lib/faye/rack_stream.rb', line 58

def receive(data)
end

#write(data) ⇒ Object



61
62
63
64
65
66
# File 'lib/faye/rack_stream.rb', line 61

def write(data)
  return @rack_hijack_io.write(data) if @rack_hijack_io
  return @stream_send.call(data) if @stream_send
rescue => e
  fail if EOFError === e
end