1#!/usr/bin/env perl 2 3use strict; 4use warnings; 5 6use Protocol::WebSocket::Handshake::Server; 7use Protocol::WebSocket::Frame; 8 9use IO::Socket::INET; 10use IO::Async::Listener; 11 12use IO::Async::Loop; 13my $loop = IO::Async::Loop->new; 14 15my $listener = IO::Async::Listener->new( 16 on_stream => sub { 17 my ($self, $stream) = @_; 18 19 my $hs = Protocol::WebSocket::Handshake::Server->new; 20 my $frame = Protocol::WebSocket::Frame->new; 21 22 $stream->configure( 23 on_read => sub { 24 my ($self, $buffref, $closed) = @_; 25 26 if (!$hs->is_done) { 27 $hs->parse($$buffref); 28 29 if ($hs->is_done) { 30 $self->write($hs->to_string); 31 } 32 33 $$buffref = ""; 34 return 0; 35 } 36 37 $frame->append($$buffref); 38 39 while (my $message = $frame->next) { 40 $self->write($frame->new($message)->to_bytes); 41 } 42 43 $$buffref = ""; 44 return 0; 45 } 46 ); 47 48 $loop->add($stream); 49 } 50); 51 52$loop->add($listener); 53 54my $socket = IO::Socket::INET->new( 55 LocalAddr => 'localhost', 56 LocalPort => 3000, 57 Listen => 1, 58); 59 60$listener->listen(handle => $socket); 61#$listener->listen(addr => ['localhost'], port => 3000, on_listen_error => sub {}); 62 63$loop->loop_forever; 64