#!/usr/bin/env perl use strict; use warnings; use Protocol::WebSocket::Handshake::Server; use Protocol::WebSocket::Frame; use IO::Socket::INET; use IO::Async::Listener; use IO::Async::Loop; my $loop = IO::Async::Loop->new; my $listener = IO::Async::Listener->new( on_stream => sub { my ($self, $stream) = @_; my $hs = Protocol::WebSocket::Handshake::Server->new; my $frame = Protocol::WebSocket::Frame->new; $stream->configure( on_read => sub { my ($self, $buffref, $closed) = @_; if (!$hs->is_done) { $hs->parse($$buffref); if ($hs->is_done) { $self->write($hs->to_string); } $$buffref = ""; return 0; } $frame->append($$buffref); while (my $message = $frame->next) { $self->write($frame->new($message)->to_bytes); } $$buffref = ""; return 0; } ); $loop->add($stream); } ); $loop->add($listener); my $socket = IO::Socket::INET->new( LocalAddr => 'localhost', LocalPort => 3000, Listen => 1, ); $listener->listen(handle => $socket); #$listener->listen(addr => ['localhost'], port => 3000, on_listen_error => sub {}); $loop->loop_forever;