Skip to content

Instantly share code, notes, and snippets.

@noteflakes
Last active July 28, 2020 19:41
Show Gist options
  • Save noteflakes/c213f634ce487143f73e7fe5e5717331 to your computer and use it in GitHub Desktop.
Save noteflakes/c213f634ce487143f73e7fe5e5717331 to your computer and use it in GitHub Desktop.
A brief demo showing Websocket client and server capabilities using Polyphony and Tipi
# 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
loop do
data = @socket.readpartial(8192)
@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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment