class SpiderGazelle::Websocket

Attributes

env[R]
reactor[R]
socket[R]
url[R]

Public Class Methods

new(tcp, env) click to toggle source
Calls superclass method
# File lib/spider-gazelle/upgrades/websocket.rb, line 13
def initialize(tcp, env)
    @socket, @env = tcp, env

    # Initialise the promise
    super tcp.reactor, tcp.reactor.defer

    scheme = env['rack.url_scheme'] == 'https' ? 'wss://' : 'ws://'
    @url = scheme + env['HTTP_HOST'] + env['REQUEST_URI']
    @driver = ::WebSocket::Driver.rack self

    # Pass data from the socket to the driver
    @socket.progress do |data|
        begin
            @driver.parse data
        rescue Exception => e
            # Prevent hanging sockets
            @socket.close
            raise e
        end
    end
    @socket.finally do
        if @shutdown_called.nil?
            @defer.reject WebSocket::Driver::CloseEvent.new(1006, 'connection was closed unexpectedly')
        end
    end

    # Driver has indicated that it is closing
    # We'll close the socket after writing any remaining data
    @driver.on :close do |event|
        @shutdown_called = true
        @socket.shutdown
        @defer.resolve event
    end
    @driver.on :message do |event|
        @progress.call(event.data, self) unless @progress.nil?
    end
    @driver.on :error do |event|
        @defer.reject event
    end
end

Public Instance Methods

binary(array) click to toggle source

Write some binary data to the websocket connection

@param array [Array] an array of bytes to be sent to the far end

# File lib/spider-gazelle/upgrades/websocket.rb, line 64
def binary(array)
    @reactor.schedule { @driver.binary(array.to_a) }
end
on_open(callback = nil, &blk) click to toggle source

Used to define a callback when the websocket connection is established Data sent before this callback is buffered.

@param callback [Proc] the callback to be triggered on establishment

# File lib/spider-gazelle/upgrades/websocket.rb, line 79
def on_open(callback = nil, &blk)
    callback ||= blk
    @driver.on :open, &callback
end
progress(callback = nil, &blk) click to toggle source

Used to define a callback when data is received from the client

@param callback [Proc] the callback to be called when data is received

# File lib/spider-gazelle/upgrades/websocket.rb, line 71
def progress(callback = nil, &blk)
    @progress = callback || blk
end
text(string) click to toggle source

Write some text to the websocket connection

@param string [String] a string of data to be sent to the far end

# File lib/spider-gazelle/upgrades/websocket.rb, line 57
def text(string)
    @reactor.schedule { @driver.text(string.to_s) }
end