Sha256: faa476c2acc4afe5fa2665b28530c65ee8af8fe8cf3e5a10706c41931d9f9032

Contents?: true

Size: 1.76 KB

Versions: 10

Compression:

Stored size: 1.76 KB

Contents

# frozen_string_literal: true

require 'bundler/setup'
require 'tipi'
require 'tipi/websocket'

class WebsocketClient
  def initialize(url, headers = {})
    @socket = TCPSocket.new('127.0.0.1', 1234)
    do_handshake(url, headers)
  end

  def do_handshake(url, headers)
    handshake = WebSocket::Handshake::Client.new(url: url, headers: headers)
    @socket << handshake.to_s
    @socket.read_loop do |data|
      handshake << data
      break if handshake.finished?
    end
    raise 'Websocket handshake failed' unless handshake.valid?
    @version = handshake.version

    @reader = WebSocket::Frame::Incoming::Client.new(version: @version)
  end

  def receive
    parsed = @reader.next
    return parsed if parsed

    @socket.read_loop do |data|
      @reader << data
      parsed = @reader.next
      return parsed if parsed
    end
  end

  def send(data)
    frame = WebSocket::Frame::Outgoing::Client.new(
      version: @version,
      data: data,
      type: :text
    )
    @socket << frame.to_s
  end
  alias_method :<<, :send

  def close
    @socket.close
  end
end

server = spin do
  websocket_handler = Tipi::Websocket.handler do |conn|
    while (msg = conn.recv)
      conn << "you said: #{msg}"
    end
  end

  opts = { upgrade: { websocket: websocket_handler } }
  puts 'Listening on port http://127.0.0.1:1234/'
  Tipi.serve('0.0.0.0', 1234, opts) do |req|
    req.respond("Hello world!\n")
  end
end

sleep 0.01 # wait for server to start

clients = (1..3).map do |i|
  spin do
    client = WebsocketClient.new('ws://127.0.0.1:1234/', { Cookie: "SESSIONID=#{i * 10}" })
    (1..3).each do |j|
      sleep rand(0.2..0.5)
      client.send "Hello from client #{i} (#{j})"
      puts "server reply: #{client.receive}"
    end
    client.close
  end
end

Fiber.await(*clients)

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
tipi-0.55 examples/websocket_demo.rb
tipi-0.54 examples/websocket_demo.rb
tipi-0.53 examples/websocket_demo.rb
tipi-0.52 examples/websocket_demo.rb
tipi-0.51 examples/websocket_demo.rb
tipi-0.50 examples/websocket_demo.rb
tipi-0.49 examples/websocket_demo.rb
tipi-0.47 examples/websocket_demo.rb
tipi-0.46 examples/websocket_demo.rb
tipi-0.45 examples/websocket_demo.rb