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