The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

package SampleChatServer;

use strict;
use warnings;

use base 'Net::Server::Multiplex';

use Protocol::WebSocket::Handshake::Server;
use Protocol::WebSocket::Frame;

__PACKAGE__->run;

my $hs;
my $frame;

sub mux_connection {
    my $self = shift;
    my ($mux, $fh) = @_;
    my $peer = $self->{peeraddr};

    $self->{id}       = $self->{net_server}->{server}->{requests};
    $self->{peerport} = $self->{net_server}->{server}->{peerport};
}

sub mux_input {
    my $self = shift;
    my ($mux, $fh, $in_ref) = @_;

    $hs    ||= Protocol::WebSocket::Handshake::Server->new;
    $frame ||= Protocol::WebSocket::Frame->new;

    if (!$hs->is_done) {
        $hs->parse($$in_ref);

        if ($hs->is_done) {
            print $fh $hs->to_string;
        }

        $$in_ref = "";
        return 0;
    }

    $frame->append($$in_ref);

    while (my $message = $frame->next) {
        print $fh $frame->new($message)->to_bytes;
    }

    $$in_ref = "";
}