Sha256: b6c46ae7bb278669e76c99fda458d46ab30a73236d223f0a2d160500a0586bac

Contents?: true

Size: 1.01 KB

Versions: 7

Compression:

Stored size: 1.01 KB

Contents

require 'jellyfish'
require 'websocket_parser'
require 'digest/sha1'

module Jellyfish
  module WebSocket
    ::WebSocket.constants.each do |const|
      const_set(const, ::WebSocket.const_get(const))
    end

    attr_reader :sock, :parser

    def switch_protocol &block
      key = env['HTTP_SEC_WEBSOCKET_KEY']
      accept = [Digest::SHA1.digest("#{key}#{GUID}")].pack('m0')
      @sock = env['rack.hijack'].call
      sock.binmode
      sock.write(<<-HTTP)
HTTP/1.1 101 Switching Protocols\r
Upgrade: websocket\r
Connection: Upgrade\r
Sec-WebSocket-Accept: #{accept}\r
\r
      HTTP
      @parser = Parser.new
      parser.on_message(&block)
    end

    def ws_start
      while !sock.closed? && IO.select([sock]) do
        ws_read
      end
    end

    def ws_read bytes=8192
      parser << sock.readpartial(bytes)
    rescue EOFError
      sock.close
    end

    def ws_write msg
      sock << Message.new(msg).to_data
    end

    def ws_close
      sock << Message.close.to_data
      sock.close
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
jellyfish-1.2.2 lib/jellyfish/websocket.rb
jellyfish-1.2.1 lib/jellyfish/websocket.rb
jellyfish-1.2.0 lib/jellyfish/websocket.rb
jellyfish-1.1.1 lib/jellyfish/websocket.rb
jellyfish-1.1.0 lib/jellyfish/websocket.rb
jellyfish-1.0.2 lib/jellyfish/websocket.rb
jellyfish-1.0.1 lib/jellyfish/websocket.rb