class Faye::RackStream
Public Class Methods
Source
# File lib/faye/rack_stream.rb, line 18 def initialize(socket) @socket_object = socket @connection = socket.env['em.connection'] @stream_send = socket.env['stream.send'] @rack_hijack_io = @rack_hijack_io_reader = nil hijack_rack_socket @connection.socket_stream = self if @connection.respond_to?(:socket_stream) end
Public Instance Methods
Source
# File lib/faye/rack_stream.rb, line 55 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
Source
# File lib/faye/rack_stream.rb, line 61 def close_connection clean_rack_hijack @connection.close_connection if @connection end
Source
# File lib/faye/rack_stream.rb, line 66 def close_connection_after_writing clean_rack_hijack @connection.close_connection_after_writing if @connection end
Source
# File lib/faye/rack_stream.rb, line 71 def each(&callback) @stream_send ||= callback end
Source
# File lib/faye/rack_stream.rb, line 30 def hijack_rack_socket return unless @socket_object.env['rack.hijack'] @socket_object.env['rack.hijack'].call @rack_hijack_io = @socket_object.env['rack.hijack_io'] queue = Queue.new EventMachine.schedule do begin EventMachine.attach(@rack_hijack_io, Reader) do |reader| reader.stream = self if @rack_hijack_io @rack_hijack_io_reader = reader else reader.close_connection_after_writing end end ensure queue.push(nil) end end queue.pop if EventMachine.reactor_running? end
Source
# File lib/faye/rack_stream.rb, line 81 def write(data) return @rack_hijack_io_reader.send_data(data) if @rack_hijack_io_reader 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