Sha256: 3cf24e4c51cfa84cb596b614b7b3a19b80f06b2cc6ecc9c259991fc3b9ad7db8

Contents?: true

Size: 1.85 KB

Versions: 10

Compression:

Stored size: 1.85 KB

Contents

# frozen_string_literal: true

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'polyphony', '~> 0.44'
  gem 'tipi', '~> 0.31'
end

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.39 examples/websocket_demo.rb
tipi-0.38 examples/websocket_demo.rb
tipi-0.37.2 examples/websocket_demo.rb
tipi-0.37.1 examples/websocket_demo.rb
tipi-0.37 examples/websocket_demo.rb
tipi-0.36 examples/websocket_demo.rb
tipi-0.35 examples/websocket_demo.rb
tipi-0.34 examples/websocket_demo.rb
tipi-0.33 examples/websocket_demo.rb
tipi-0.32 examples/websocket_demo.rb