Sha256: 99f23beeea9a4802d6d410c8ad5e26ccd5fa8ad37be1a2eb1a02de0d69f84038

Contents?: true

Size: 1.28 KB

Versions: 9

Compression:

Stored size: 1.28 KB

Contents

# frozen_string_literal: true

require 'digest/sha1'
require 'websocket'

module Tipi
  # Websocket connection
  class Websocket
    def self.handler(&block)
      proc do |adapter, headers|
        req = Qeweney::Request.new(headers, adapter)
        websocket = req.upgrade_to_websocket
        block.(websocket)
      end
    end

    def initialize(conn, headers)
      @conn = conn
      @headers = headers
      @version = headers['sec-websocket-version'].to_i
      @reader = ::WebSocket::Frame::Incoming::Server.new(version: @version)
    end
    
    def recv
      if (msg = @reader.next)
        return msg.to_s
      end
    
      @conn.recv_loop do |data|
        @reader << data
        if (msg = @reader.next)
          return msg.to_s
        end
      end

      nil
    end

    def recv_loop
      if (msg = @reader.next)
        yield msg.to_s
      end

      @conn.recv_loop do |data|
        @reader << data
        while (msg = @reader.next)
          yield msg.to_s
        end
      end
    end
    
    OutgoingFrame = ::WebSocket::Frame::Outgoing::Server

    def send(data)
      frame = OutgoingFrame.new(
        version: @version, data: data, type: :text
      )
      @conn << frame.to_s
    end
    alias_method :<<, :send

    def close
      @conn.close
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
tipi-0.43 lib/tipi/websocket.rb
tipi-0.42 lib/tipi/websocket.rb
tipi-0.41 lib/tipi/websocket.rb
tipi-0.40 lib/tipi/websocket.rb
tipi-0.39 lib/tipi/websocket.rb
tipi-0.38 lib/tipi/websocket.rb
tipi-0.37.2 lib/tipi/websocket.rb
tipi-0.37.1 lib/tipi/websocket.rb
tipi-0.37 lib/tipi/websocket.rb